<div class="dialogueBox">
<div class="dialogueText">18+ Only!
All characters are 18+</div>
</div>
<div class="dialogueBox">
<div class="dialogueText">By selecting Continue, you affirm that you meet the legal age requirement for accessing adult content in your region.</div>
</div>
Current version: 0.01
[[Continue]]
<<run $(document.body).append('<div id="questNotifications"></div>') >>
<<set $hairStyle = "">>
<<set $skinTone = "">>
<<set $hairColor = "">>
<<set $gender = "">>
<<set $eyeColor = "">>
<<set $height = 60>> <!-- stored as inches -->
<<set $bodyType = "">>
<<set $bloodstatus = "">>
<<set $house to "">>
<<set $breast to "">>
<<set $genitals to "">>
<<set $genitalSize = 4>>
<<set $gold = 0>>
<<set $showQuests = false>>
<<set $showInventory = false>>
<<set $showRelationships = false>>
<<set $inventory = []>>
<<set $inventoryQuantities = {}>>
<<set $quests = []>>
<<set $completedQuests = []>>
<<set $questIdCounter = 0>>
<<set $relationships = {}>>
<<set $petInfoPassage = "">>
<<set $questGiven_Supplies = false>>
<<set $questGiven_Lineage = false>>
<<set $robesDone = false>>
<<set $wandDone = false>>
<<set $booksDone = false>>
<<set $petsDone = false>>
<<set $generalEquipmentBought = false>>
<<set $starterAllowanceGiven = false>>
<<set $inheritanceGiven = false>>
<<script>>
/* ---------------------------
ADD GOLD
--------------------------- */
window.addGold = function(amount) {
State.variables.gold += amount;
if (State.variables.gold < 0) State.variables.gold = 0;
};
/* ---------------------------
ADD ITEM TO INVENTORY
--------------------------- */
window.addItem = function(name, qty = 1) {
const inv = State.variables.inventory;
const q = State.variables.inventoryQuantities;
if (!inv.includes(name)) {
inv.push(name);
q[name] = qty;
} else {
q[name] += qty;
}
};
/* Ensure quest arrays exist */
if (!State.variables.quests) State.variables.quests = [];
if (!State.variables.completedQuests) State.variables.completedQuests = [];
/* ---------------------------
CREATE A QUEST
--------------------------- */
window.addQuest = function(title, description, steps) {
const quests = State.variables.quests;
// Avoid duplicates
if (quests.some(q => q.title === title)) return;
const quest = {
id: Date.now(), // unique
title: title,
description: description,
steps: steps, // array of strings
currentStep: 0, // index
status: "active"
}
quests.push(quest);
showQuestNotification("Quest Added: " + title);
};
/* ---------------------------
ADVANCE STEP IN A QUEST
--------------------------- */
window.advanceQuest = function (id) {
const v = State.variables;
let q = v.quests.find(q => q.id === id);
if (!q) return;
q.currentStep++;
if (q.currentStep >= q.steps.length) {
q.status = "complete";
v.completedQuests.push(q);
// remove from active
v.quests = v.quests.filter(x => x.id !== id);
showQuestNotification("Quest Complete: " + q.title);
}
Engine.play(passage());
};
/* ---------------------------
SHOW NOTIFICATION POPUP
--------------------------- */
window.showQuestNotification = function (text) {
const note = document.createElement("div");
note.className = "quest-notification";
note.innerText = text;
document.body.appendChild(note);
setTimeout(() => note.classList.add("show"), 50);
setTimeout(() => note.classList.remove("show"), 3000);
setTimeout(() => note.remove(), 3500);
};
/* ---------------------------
GOLD HELPERS
--------------------------- */
window.addGold = function (amount, reason) {
const v = State.variables;
if (typeof v.gold !== "number") {
v.gold = 0;
}
v.gold += amount;
if (v.gold < 0) v.gold = 0;
const sign = amount >= 0 ? "+" : "";
const message = reason
? `${sign}${amount} Gold — ${reason}`
: `${sign}${amount} Gold`;
if (window.showQuestNotification) {
showQuestNotification(message);
}
};
window.spendGold = function (amount, reason) {
const v = State.variables;
if (typeof v.gold !== "number") {
v.gold = 0;
}
if (v.gold < amount) {
// Not enough gold
if (window.showQuestNotification) {
showQuestNotification("Not enough gold.");
}
return false;
}
v.gold -= amount;
const message = reason
? `-${amount} Gold — ${reason}`
: `-${amount} Gold`;
if (window.showQuestNotification) {
showQuestNotification(message);
}
return true;
};
/* ---------------------------
RELATIONSHIP SYSTEM
--------------------------- */
window.addRelationship = function(name, age, type="human") {
const v = State.variables;
if (!v.relationships) v.relationships = {};
if (v.relationships[name]) return;
v.relationships[name] = {
name: name,
age: age,
type: type // NEW
};
if (window.showRelationshipNotification) {
showRelationshipNotification("Relationship Added: " + name);
}
};
window.updateRelationship = function(name, updates) {
const v = State.variables;
if (!v.relationships || !v.relationships[name]) return;
Object.assign(v.relationships[name], updates);
if (window.showRelationshipNotification) {
showRelationshipNotification("Relationship Updated: " + name);
}
};
/* ---------------------------
RELATIONSHIP NOTIFICATION
--------------------------- */
window.showRelationshipNotification = function (text) {
const note = document.createElement("div");
note.className = "quest-notification";
note.innerText = text;
document.body.appendChild(note);
setTimeout(() => note.classList.add("show"), 50);
setTimeout(() => note.classList.remove("show"), 3000);
setTimeout(() => note.remove(), 3500);
};
<</script>>
<<set $alexisGenitals to "Unknown">>
<<set $alexGenitals to "Unknown">>
<<set $alexisHouse to "Unsorted">>
<<set $alexHouse to "Unsorted">>
<<set $alexisAffinity = 0>>
<<set $alexAffinity = 0>>
<<set $alexisRelationship = "neutral">>
<<set $alexRelationship = "neutral">>
<<set $alexisRelation = "Aquintances">>
<<set $alexRelation = "Aquintances">>
<<set $clarissaRelation = "Professor">>
<<set $playerFriend to "">>
<<set $petType = "">>
<<set $petName = "">>
<<set _exName = "">>
<<set _exGender = "">>
<<set _exAge = 19>>
<<set $profHawthorneGenitals to "Unknown">>
<<set $profHawthorneRelation = 0>><div class="creator">
<div>
<label><strong>Name</strong></label><br>
<input type="text" id="nameInput" placeholder="Enter name">
</div>
<div>
<label>Pronouns:</label>
<select data-var="$gender">
<option>He/Him/His</option>
<option>She/Her/Hers</option>
<option>They/Them/Their</option>
<option>Unselected</option>
</select>
</div>
<div>
<label>Skin Tone:</label>
<select data-var="$skinTone">
<option>Pale</option>
<option>Fair</option>
<option>Light</option>
<option>Medium</option>
<option>Tan</option>
<option>Olive</option>
<option>Brown</option>
<option>Dark</option>
<option>Unselected</option>
</select>
</div>
<div>
<label>Hair Style:</label>
<select data-var="$hairStyle">
<option>Short Crop</option>
<option>Buzz Cut</option>
<option>Faded Undercut</option>
<option>Messy Fringe</option>
<option>Side-Parted Short</option>
<option>Wavy Medium</option>
<option>Shoulder-Length Straight</option>
<option>Curly Shoulder-Length</option>
<option>Layered Shag</option>
<option>Wolf Cut</option>
<option>Long Straight</option>
<option>Long Wavy</option>
<option>Long Curly</option>
<option>Pixie Cut</option>
<option>Bob Cut</option>
<option>Blunt Bob</option>
<option>Curly Bob</option>
<option>Half-Up Bun</option>
<option>Braided Ponytail</option>
<option>Dutch Braids</option>
<option>High Ponytail</option>
<option>Low Ponytail</option>
<option>Top Knot</option>
<option>Loose Waves</option>
<option>Quiff</option>
<option>Pompadour</option>
<option>Short Spiky</option>
<option>Medium Tousled</option>
<option>Half-Shaved Style</option>
<option>Soft Curls</option>
<option>Ringlets</option>
<option>Locs (Short)</option>
<option>Locs (Long)</option>
<option>Box Braids</option>
<option>Fishtail Braid</option>
<option>Hime Cut</option>
<option>Feathered Long Hair</option>
<option>Shoulder-Length Waves</option>
<option>Wavy Bob</option>
<option>Unselected</option>
</select>
</div>
<div>
<label>Hair Color:</label>
<select data-var="$hairColor">
<option>Brown</option>
<option>Black</option>
<option>Blonde</option>
<option>Red</option>
<option>White</option>
<option>Ginger</option>
<option>Auburn</option>
<option>Chestnut</option>
<option>Dirty Blonde</option>
<option>Strawberry Blonde</option>
<option>Jet Black</option>
<option>Silver</option>
<option>Ash Brown</option>
<option>Ash Blonde</option>
<option>Platinum Blonde</option>
<option>Golden Blonde</option>
<option>Dark Brown</option>
<option>Light Brown</option>
<option>Midnight Blue</option>
<option>Dark Green</option>
<option>Purple</option>
<option>Pink</option>
<option>Unselected</option>
</select>
</div>
<div>
<label>Eye Color:</label>
<select data-var="$eyeColor">
<option>Blue</option>
<option>Green</option>
<option>Brown</option>
<option>Gray</option>
<option>Unselected</option>
</select>
</div>
<div>
<label>Height:</label>
<input id="heightSlider" type="range" min="48" max="84" step="1" data-var="$height" value="<<print $height>>">
<span id="heightText"></span>
</div>
<div>
<label>Body Type:</label>
<select data-var="$bodyType">
<option>Average</option>
<option>Slim</option>
<option>Athletic</option>
<option>Broad</option>
<option>Curvy</option>
<option>Unselected</option>
</select>
</div>
<div>
<label>Chest:</label>
<select data-var="$breast">
<option>Flat</option>
<option>Petite</option>
<option>Average</option>
<option>Full</option>
<option>Huge</option>
<option>Unselected</option>
</select>
</div>
<div>
<label>Genitals:</label>
<select data-var="$genitals">
<option>Penis</option>
<option>Vagina</option>
<option>Unselected</option>
</select>
</div>
<div id="penisBlock" style="display:none; text-align:center; width:100%; margin-top:10px;">
<label><strong>Penis Size:</strong></label><br>
<input
id="penisSlider"
type="range"
min="1"
max="12"
step="1"
data-var="$genitalSize"
value="<<print $genitalSize>>">
<div id="genitalSizeText" style="margin-top:5px;"></div>
</div>
<div class="full-row">
<label>Blood Status:</label>
<select data-var="$bloodstatus">
<option>Arcane-Locked</option>
<option>Mixed-Line</option>
<option>Deepborn</option>
<option>Unselected</option>
</select>
</div>
<div class="full-row" id="preview">
<<include "Preview">>
</div>
<div class="button-row">
<button onclick="randomizeCharacter()">Randomize</button>
<button onclick="resetCharacter()">Reset</button>
<span id="confirmLink">[[Confirm]]</span>
</div>
</div>
<<script>>
function updateGenitalsVisibility() {
const g = State.variables.genitals;
if (g === "Penis") {
$("#penisBlock").show();
updatePenisText();
}
else {
$("#penisBlock").hide();
}
}
// --- NAME INPUT HANDLER ---
$(document).on("input", "#nameInput", function() {
State.variables.name = $(this).val();
updatePreview();
validateCharacter();
});
// --- HEIGHT FORMATTER ---
function formatHeight(inches) {
const feet = Math.floor(inches / 12);
const inch = Math.round(inches % 12);
return feet + " ft " + inch + " in";
}
function updateHeightText() {
const val = parseInt($("#heightSlider").val());
$("#heightText").text(formatHeight(val));
}
function updatePenisText() {
const val = parseInt($("#penisSlider").val());
$("#genitalSizeText").text(val + "inches");
}
function validateCharacter() {
const v = State.variables;
// List of required variables
const required = [
v.name,
v.gender,
v.hairColor,
v.eyeColor,
v.height,
v.skinTone,
v.bodyType,
v.bloodstatus,
v.breast,
v.genitals,
v.hairStyle
];
// Check for empty or "Unselected"
const invalid = required.some(x => !x || x === "Unselected");
if (invalid) {
$("#confirmLink").addClass("disabledChoice");
} else {
$("#confirmLink").removeClass("disabledChoice");
}
}
// --- PREVIEW REFRESH ---
function updatePreview() {
$("#preview").empty().wiki('<<include "Preview">>');
}
// --- ANY DROPDOWN / SLIDER CHANGE ---
$(document).on("change input", "[data-var]", function() {
const v = $(this).data("var");
const val = $(this).val();
if (v === "$height") {
State.variables.height = parseInt(val);
updateHeightText();
} else {
State.variables[v.substring(1)] = val;
}
// 🔥 ADD THIS:
updateGenitalsVisibility();
validateCharacter();
updatePreview();
});
// --- RANDOMIZE BUTTON ---
window.randomizeCharacter = function() {
const Name = [
"Alistair","Alec","Archibald","Barnaby","Benedict","Callum","Cedric","Corwin",
"Dominic","Ellis","Emrys","Edmund","Fenwick","Fletcher","Garrick","Gideon",
"Hadrian","Hugo","Ignatius","Jasper","Kingsley","Leander","Lysander","Magnus",
"Montague","Orion","Percival","Quentin","Regulus","Rowan","Silas","Tobias",
"Tristan","Wilfred","Xavier","York","Zacharias",
"Adeline","Astrid","Beatrice","Briony","Cassandra","Celia","Clarissa","Daphne",
"Edeline","Eira","Elysia","Elowen","Felicity","Florence","Genevieve","Gwen",
"Harriet","Helena","Imogen","Isolde","Juliet","Lavinia","Lilith","Marigold",
"Minerva","Morgana","Nerissa","Octavia","Ophelia","Penelope","Rhiannon",
"Rosalind","Seraphina","Tabitha","Thalia","Verity","Winifred","Yvaine","Zara"
];
const gender = ["He/Him/His","She/Her/Hers","They/Them/Their"];
const hair = [
"Brown","Black","Blonde","Red","White",
"Ginger","Auburn","Chestnut","Dirty Blonde","Strawberry Blonde",
"Jet Black","Silver","Ash Brown","Ash Blonde",
"Platinum Blonde","Golden Blonde","Dark Brown","Light Brown",
"Midnight Blue","Dark Green","Purple","Pink"
];
const Style = ["Short Crop","Buzz Cut","Faded Undercut","Messy Fringe","Side-Parted Short", "Wavy Medium","Shoulder-Length Straight","Curly Shoulder-Length","Layered Shag","Wolf Cut","Long Straight","Long Wavy","Long Curly","Pixie Cut","Bob Cut","Blunt Bob","Curly Bob","Half-Up Bun","Braided Ponytail","Dutch Braids","High Ponytail","Low Ponytail","Top Knot","Loose Waves","Quiff","Pompadour","Short Spiky","Medium Tousled","Half-Shaved Style","Soft Curls","Ringlets","Locs (Short)","Locs (Long)","Box Braids","Fishtail Braid","Hime Cut","Feathered Long Hair","Shoulder-Length Waves","Wavy Bob"];
const eyes = ["Blue","Green","Brown","Gray"];
const body = ["Average","Slim","Athletic","Broad","Curvy"];
const blood = ["Arcane-Locked","Mixed-Line","Deepborn"];
const Breast = ["Flat","Petite","Average","Full","Huge"];
const Genital = ["Penis","Vagina"];
const skinTone = ["Pale","Fair","Light","Medium","Tan","Olive","Brown","Dark"];
// Assign random values to variables
State.variables.name = Name.random();
State.variables.gender = gender.random();
State.variables.hairColor = hair.random();
State.variables.eyeColor = eyes.random();
State.variables.height = Math.floor(Math.random() * (84 - 48 + 1)) + 48;
State.variables.bodyType = body.random();
State.variables.bloodstatus = blood.random();
State.variables.breast = Breast.random();
State.variables.genitals = Genital.random();
State.variables.genitalSize = Math.floor(Math.random() * 12) + 1;
State.variables.hairStyle = Style.random();
State.variables.skinTone = skinTone.random();
$("[data-var='$skinTone']").val(State.variables.skinTone);
// Sync inputs and selects with those new values
$("[data-var='$gender']").val(State.variables.gender);
$("[data-var='$hairColor']").val(State.variables.hairColor);
$("[data-var='$eyeColor']").val(State.variables.eyeColor);
$("[data-var='$bodyType']").val(State.variables.bodyType);
$("[data-var='$bloodstatus']").val(State.variables.bloodstatus);
$("[data-var='$breast']").val(State.variables.breast);
$("[data-var='$genitals']").val(State.variables.genitals);
$("[data-var='$hairStyle']").val(State.variables.hairStyle);
$("#nameInput").val(State.variables.name);
$("#heightSlider").val(State.variables.height);
$("#penisSlider").val(State.variables.genitalSize);
// Update displays
updateHeightText();
updatePenisText();
updateGenitalsVisibility();
updatePreview();
validateCharacter();
};
// --- RESET BUTTON ---
window.resetCharacter = function() {
State.variables.name = ""; // ★ Reset name
State.variables.gender = "";
State.variables.hairColor = "";
State.variables.eyeColor = "";
State.variables.height = "60" ;
State.variables.bodyType = "";
State.variables.bloodstatus = "";
State.variables.breast = "";
State.variables.genitals = "";
$("#nameInput").val(""); // ★ Clear input box
$("#heightSlider").val(60);
$("#heightSlider").val(State.variables.height);
$("#penisSlider").val(4);
$("#penisSlider").val(State.variables.genitalSize);
updateHeightText();
updatePreview();
updatePenisText();
updateGenitalsVisibility();
validateCharacter();
};
// --- INITIAL HEIGHT DISPLAY ---
$(document).ready(function() {
updateHeightText();
validateCharacter();
});
<</script>>
<<set _feet = Math.floor($height / 12)>>
<<set _inch = $height % 12>>
<b>Preview:</b><br>
Name: <<print $name>>
Height: <<print _feet>> ft <<print _inch>>
Body type: <<print $bodyType.toLowerCase()>>
Skin Tone: <<print $skinTone>>
Hair Style: <<print $hairStyle>>
Hair Colour: <<print $hairColor.toLowerCase()>>
Eye colour: <<print $eyeColor.toLowerCase()>>
Pronouns: <<print $gender>>
Breasts: <<print $breast>>
Genitals: <<print $genitals>>
<<if $genitals is "Vagina" || $genitals is "">>
<<else>>
Penis Size: <<print $genitalSize>> inches
<</if>>
Blood-Status: <<print $bloodstatus>> <<if $bloodstatus is "Arcane-Locked">>
<p><em>Born without magical lineage, but awakened through rare arcane sparks.</em></p>
<<elseif $bloodstatus is "Mixed-Line">>
<p><em>A balance of mundane and magical ancestry.</em></p>
<<elseif $bloodstatus is "Deepborn">>
<p><em>Descended from generations of magic-wielders.</em></p>
<<else>>
<p><em>Select a bloodline to see its description.</em></p>
<</if>>.creator {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 1.2em 2em;
align-items: center;
margin-top: 1em;
}
.creator label {
display: block;
font-weight: bold;
margin-bottom: 0.2em;
}
.creator select,
.creator input[type="range"] {
width: 100%;
}
.creator .full-row {
grid-column: span 2; /* makes element span both columns */
text-align: center;
margin-top: 1em;
}
In the rolling English hills, hidden past winding country roads and pockets of old forest, stands Hexmoor Academy—the UK’s oldest and most respected institution for adult magical education.
Here, magic isn’t taught to children.
It never has been.
Across Britain, Scotland, Wales, and Northern Ireland, young witches and sorcerers are raised knowing that their formal training begins only once they reach adulthood—old enough to shape their abilities responsibly, and old enough to understand the weight of using them.
Hexmoor accepts students between the ages of eighteen and twenty-five. Its halls are filled with young adults from every corner of the United Kingdom: fresh-faced newcomers just stepping into independence, seasoned apprentices who delayed their studies, and those still trying to grasp who they are and what their magic means.
And now, you stand among them.
Where your path leads from here is entirely up to [[you.]]<div id="floating-controls">
<<link "Save">><<save>><</link>>
<<link "Restart">><<restart>><</link>>
<div id="quest-button" style="display:none;">
<button onclick="Engine.play('Quests')">Quests</button>
</div>
</div>
<audio id="tap" src="audio/taptaptap.mp3"></audio>
<<script>>
$(document).one(':passageend', function () {
document.getElementById("tap").play();
});
<</script>>
You freeze mid-movement.
The tapping comes again—sharp, deliberate, impatient.
Tap. Tap. Tap.
Your head turns toward the window, pulse ticking a little faster now. The morning light catches on the glass just right, revealing a faint, shifting outline on the other side.
You step closer.
There, perched on the narrow sill, feathers ruffled against the cold, is an owl—broad-winged, amber-eyed, and staring straight at you as if you’re the strange one here. It taps its beak against the window again, more insistently this time, as though offended you’ve taken this long to notice.
You unlatch the window and push it open. A rush of crisp air sweeps in, and the owl hops forward without hesitation, gliding inside with a surprisingly graceful swoop that circles your room once before landing neatly on the corner of your bed.
Only then do you see it.
A letter, tied securely to its leg with a thin ember-orange ribbon.
Your clothes forgotten in your hands, you move closer, slowly, almost afraid to blink in case the moment evaporates. The owl extends its leg toward you, deliberate and regal, as if this is something it’s done a thousand times before.
The envelope is thick, cream-coloured, the paper heavy and textured. <<print $name>> is written across the front in deep ink—beautiful, impossibly elegant handwriting.
Your fingers hover above it for a heartbeat before you finally lift the letter free.
The owl hoots once—soft, approving—then settles itself, waiting.
As though it already knows you’re going to open it.
[[Open it]]--------------------------[[Pet the owl]]
The owl blinks at you from its place on the corner of your bed as you finally turn your attention back to the envelope resting in your hands. It sits calmly atop your rumpled blankets, feathers puffed slightly from the cool draft drifting through the still-open window, its golden eyes fixed unblinking on you as though evaluating your every breath.
The parchment feels heavier now—not physically, but in the way something life-changing can make even air feel thicker.
You draw a slow, steadying breath and slide the letter fully from its envelope.
The parchment glides free with a soft whisper, edges crisp beneath your fingers. The ink catches the morning light in a subtle shimmer, the handwriting elegant and deliberate—each curve and stroke crafted by someone who has written these words many times, and never lightly.
Your heart stutters.
For a moment, everything in the room falls utterly still.
You let your eyes fall to the beginning of the letter and read the words written just for you.
Dear <<print $name>>,
We are pleased to inform you that you have been accepted into the incoming class of Hexmoor Academy for Arcane Study....
The words waver—not because they’re unclear, but because the reality behind them threatens to unmoor your entire understanding of the world. A tightness builds in your throat, your breaths coming a little shorter as you try to comprehend what you’re holding.
On the bed, the owl shifts only slightly, feathers rustling in a soft, grounding sound. It watches you with quiet patience, as though it already knows the disbelief swelling inside you and is simply waiting for you to catch up.
Your fingers curl more firmly around the parchment.
This isn’t imagined.
This isn’t a joke.
This is real—astonishingly, impossibly real.
[[Read on]]
You glance back toward the bed, the cool morning air drifting in through the cracked window. The owl hasn’t moved from where it settled—right on the corner of your mattress, talons sunk lightly into the blanket, feathers puffed against the draft. Its amber eyes track you with a steady, almost knowing calm, as though waiting to see what you’ll decide.
It lets out a soft, airy huff when you step closer.
The letter is already in your hand—heavy parchment, edges crisp, your name written across the front in an elegant script you don’t recognise—but for a moment, you forget about it completely. Your free hand rises hesitantly toward the owl, hovering just above the crown of its head.
The owl tilts slightly… then leans into your touch.
Its feathers are warm beneath your fingers—downy, smooth, impossibly soft as you stroke gently along the back of its head and down its neck. A low, quiet trill hums from its throat, something between a purr and a coo, its body relaxing as though this is precisely the reassurance it had hoped for.
It doesn’t stir.
It doesn’t take flight.
It simply stays there—perched on your bed, wings tucked neatly at its sides, eyes half-lidded with a kind of serene contentment.
For a strange, suspended heartbeat, the world narrows to just this:
you, the owl resting comfortably on your blanket, and the unopened letter waiting in your other hand, its weight cool against your skin.
[[Open it]]
Dear <<print $name>>,
We are pleased to inform you that you have been accepted to attend Hexmoor Academy for Arcane Study, located within the northern English hills, for the upcoming academic cycle. You have been selected to begin formal training as an adult practitioner of the arcane arts.
As you may already know, untrained spellcasting is strictly prohibited outside of licensed institutions as outlined in the United Kingdom Magical Practice Act of 1907. Hexmoor Academy provides a legally authorised environment in which you will learn, develop, and responsibly refine your magical abilities under the guidance of accredited faculty.
Your induction day is scheduled for 1 September. Students are expected to arrive at Briarwick Station no later than 10:45 a.m., where you will be escorted to the Academy grounds.
A list of required books, materials, and recommended personal equipment is included below.
Students may also bring one approved companion creature, provided it is registered and non-aggressive. Common choices include:
a fox-sprite, a messenger owl, or a moss-toad.
We look forward to welcoming you to Hexmoor and guiding you through the disciplined study and exploration of your innate magic.
Yours faithfully,
Headmaster Aldric Thornwell
Hexmoor Academy for Arcane Study
[[Required Books & Equipment (First-Year Curriculum for Adults)]]
<<set $returnPassage = passage()>>
Uniform (All Students):
- Reactive House Robes
- Three sets of plain dark work-robes (standard adult fit)
- One formal pointed hat (black or deep charcoal)
- One pair of reinforced gloves
- One winter cloak
Course Books:
- The Principles of Channelcraft by Marwen Alderholt
- Runic Logic: Foundations of Ancient Script by Orin Feldwright
- Elemental Dynamics & Natural Forces by Elyra Thorn
- Fundamentals of Alchemy & Mixturecraft by Rowan Vell
- A Field Guide to Common & Uncommon Creatures by Dr. Lyneth Marrow
- Applied Charms & Everyday Spellforms by Cillian Drex
- Protective Magics & Countermeasures by Seraphine Locke
- Transmutation Theory for Adult Practitioners by Idris Calder
- The History of Arcane Governance in the United Kingdom by Dorian Merriweather
Other Equipment:
- 1 wand (registered and attuned)
- 1 cauldron (iron or steel, standard size 2)
- 1 set of glass phials (non-reactive)
- 1 set of calibrated brass or silver scales
- 1 arcane planner folio (non-spellcasting model)
- 1 basic alchemy kit (approved components only)
[[Put it down]]
<div style="text-align:center;">
<h2>Quests</h2>
</div>
<div class="quests-wrapper">
<<for _q range $quests>>
<div class="quest-card">
<div class="quest-title">
<<= _q.title >>
</div>
<div class="quest-description">
<<= _q.description >>
</div>
<div class="quest-progress">
Step: <<= _q.currentStep + 1 >> / <<= _q.steps.length >>
</div>
<div class="quest-step">
<<= _q.steps[_q.currentStep] >>
</div>
</div>
<</for>>
</div>
<br>
<<link "Return">><<goto $returnPassage>><</link>>
<<set $returnPassage = passage()>>
You lower the letter slowly, the parchment still warm from your grip, and set it carefully on the edge of your bed. The words swim through your mind — admissions, required supplies, a future you never imagined suddenly unfolding like a map.
A soft rustle draws your eyes back to the window.
The owl — still perched exactly where it had been — blinks once, tilting its head as if assessing your reaction. The morning light catches the flecks in its amber eyes, turning them to molten gold.
You step closer.
<div class="dialogueBox">
<div class="speakerName"><<print $name>></div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Wait—
</div>
</div>
But the owl has already made its decision.
It spreads its wings with a sweep so smooth it barely disturbs the air, pushes off the sill, and lifts into the sky. For a brief moment, its shape is framed perfectly against the pale dawn — wings outstretched, feathers catching the sun like burnished copper.
And then it’s gone.
A fading silhouette.
A whisper of wings.
Silence.
You stare after it, letter still half-folded on your bed behind you. The sudden quiet is almost unreal.
You blink hard.
Your mouth opens before you even think about it.
<div class="dialogueBox">
<div class="speakerName"><<print $name>></div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Where am I supposed to get all this stuff?
</div>
</div>
The sky offers no answer.
The owl does not return.
You’re left standing alone in your room, staring at the empty windowsill, feeling the first sharp sting of confusion — and the strange, electric thrill of a world that just opened its gates to you… and offered no instructions on how to step through.
[[A few days pass]]
Darkness presses in before the sound reaches you.
A low, distant murmur.
People speaking in hushed voices.
The soft shuffle of feet over damp grass.
Then the world sharpens—
and you realise you’re standing beneath a grey sky, the clouds hanging low and heavy like wet wool. The air smells of rain, cold earth, and wilted lilies.
You look down.
Cold fingers.
Your breath fogs faintly in the chill.
Around you, rows of chairs line the soaked ground. Witches and wizards in somber robes sit rigidly, their hats removed in respect. Umbrellas tremble in the wind. A few eyes flicker toward you—pitying, apologetic, uncertain—but no one steps close.
The coffin at the front looks far too small for how big your parents felt in your life.
A priest drones on, his voice dim as though muffled by the thick air.
<div class="dialogueBox">
<div class="speakerName">Priest</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
They were taken from us too soon, claimed by a tragedy none of us could have anticipated; may their spirits find peace and rest in light.
</div>
</div>
You try to speak.
To breathe.
To move.
To do anything—
But your feet stay rooted to the spot.
Your mother’s favourite scarf, a deep warm colour you remember clutching as a child, is draped over the polished wood. Your father’s watch lies across it, the cracked glass catching the dim light as if refusing to forget the moment it stopped. The sight punches the air from your lungs.
You blink—
And suddenly, the rain starts.
Cold needles patter against your shoulders and cheeks, running down like tears you haven’t allowed yourself to shed. Someone reaches toward you—just a shape in the blur—maybe to comfort you, maybe to guide you to your seat.
But the hand never touches.
Instead—
A howl of wind tears through the cemetery.
Your heart spikes.
The world fuzzes, shivers—
The sky cracks open with light—
—and the coffin lid begins to close.
Slowly.
Softly.
I’m not ready—
Your throat chokes on a sound that won’t come out.
The lid seals with a dull, final thunk.
You lurch forward—
And the world drops out from under you.
[[Open your eyes]]
A sharp gasp tears from your chest as you sit bolt upright, breath shaking. Sweat clings to your skin. For a moment, the room around you is nothing but shapes and shadows—too dark, too quiet, too still.
But gradually the real world returns.
Your bedroom.
Your sheets tangled.
Morning light filters weakly through your curtains, soft but intrusive, doing little to chase away the hollow ache the dream left behind. Your heart thuds too hard, too fast, as you drag a shaky hand over your face. The room is quiet—too quiet—and for a moment you sit there, letting your breathing steady, letting reality settle back into place.
Your body feels heavy, drained, as though the grief from your dream followed you into the waking world. You let out a tired groan as you force yourself out of bed.
You shuffle into the bathroom, feet cold against the floor. The mirror greets you with a reflection that looks just as exhausted as you feel—hair messy, eyes still puffy from sleep, posture slouched with that familiar really? today again? energy. You stare at yourself for a long moment before letting out a deep sigh, one that feels like it’s been sitting in your chest for years.
The shower hisses to life. Steam curls through the room, clinging to your skin as hot water spills over your shoulders, easing the tightness in your muscles and softening the raw edges left by the dream. You let it wash over you longer than necessary, letting the warmth hold you together.
When you finally step out, the mirror is fogged over, hiding your expression. Maybe that’s for the best.
You wrap a towel around yourself and pad back into your bedroom, rubbing your hair dry as you search absently for clothes—just another morning, just another attempt at normalcy.
Then—
[[tap. tap. tap]]<<set $returnPassage = passage()>>
The days that follow blur together in a strange, suspended haze.
Not quite real.
Not quite impossible.
Just… waiting.
You keep the letter close—even when you try not to. Folded neatly on your desk. Slipped into your pocket. Set on your bedside table where your eyes always seem to drift before sleep. Every time you look at it, the words feel heavier, as if the parchment itself is anchoring your world to something bigger, something you don’t fully understand yet.
The owl returns each morning.
Never intruding, never demanding—just perching on the corner of your bedframe like it’s appointed itself your silent guardian. Sometimes it naps. Sometimes it watches you with those impossibly knowing golden eyes. Sometimes it nudges its beak against your arm as if to remind you: this is happening.
You go to work. You come home. You pretend life is normal.
But nothing is.
Not when you keep finding yourself rereading the supply list until you’ve memorized every item.
Not when you catch yourself glancing at strangers on the street, wondering if any of them are… like you.
Not when your mind keeps replaying that moment—the wax seal cracking, the crest gleaming, your name inked in elegant handwriting—as if the universe whispered wake up.
Even your dreams shift.
No more funerals.
No more hollow echoes of loss.
Just fragments—torch-lit corridors, bookshelves that stretch too high, shadows that hum with a kind of quiet, impossible power.
And then—
On the third morning, as sunlight spills across your sheets, the owl rustles its feathers and nudges your arm once more. A small tap. Firm. Insistent.
When you look down, there’s another envelope grasped delicately in its beak.
Smaller. Thinner.
Sealed with the same crest.
The owl releases it into your hand, then steps back, watching you with that same patient, guiding focus.
Something shifts inside your chest.
A few days ago, everything changed.
Today… it feels like something is beginning.
[[Open the new letter]]
<<set $returnPassage = passage()>>
The envelope is lighter than the first, but the moment you touch it, something inside you steadies—
as if this one isn’t here to shake your world apart,
but to show you where to step next.
You break the seal.
It opens with none of the ceremonial weight of the first letter. No thunder in your chest.
Just a soft tear of wax and parchment, like the start of something quieter…
but just as important.
Inside is a single page.
The handwriting is different this time—still elegant, still practiced, but warmer.
Less formal. More human.
You unfold it.
Dear <<print $name>>,
I hope this letter finds you well after your initial notice of acceptance. I understand that such news—particularly when unexpected—can be overwhelming. Rest assured, you are not alone in this transition.
I would like to speak with you in person regarding your admission, your background, and the steps ahead.
Please meet me at The Thistle & Wand on the afternoon of August 5th. I will be waiting for you in the back room, and you will be able to recognise me easily.
Everything will be explained when we meet.
Until then, keep your acceptance letter safe.
And remember non-gifted perception cannot always be trusted. Magic bends the familiar around places it wishes to hide.
Sincerely,
Professor Clarissa Hawthorne
The parchment trembles slightly in your hands—
not from fear, but from the strange, electric certainty humming beneath your skin.
A meeting.
In person.
With someone from… that world.
Your world?
The owl hoots softly beside you, as if urging you to breathe.
Its wings rustle, sending a small draft over your arm.
Outside, the morning feels brighter. Sharper.
Like the day is suddenly filled with a direction you didn’t have before.
Tomorrow, you’re expected somewhere you’ve never been.
And someone is waiting for you.
[[Ask the owl what it wants]]--------------[[Re-read both letters]]<<set $returnPassage = passage()>>
You glance down at the owl, its golden eyes wide and unblinking as you lower the new envelope to your lap.
<div class="dialogueBox">
<div class="speakerName">You</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
What do you want?
</div>
</div>
Your voice comes out half-whisper, half-plea.
Surely it can’t understand you.
The owl blinks.
Then it hops—
once, twice—
a tiny, purposeful shuffle across your bedspread until it’s right beside your leg. It tilts its head, considering you.
<div class="dialogueBox">
<div class="speakerName">Owl</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
*Hoot*
</div>
</div>
And then it pecks your elbow.
Not hard.
Not aggressive.
Just a sharp, unmistakable hey.
You stare at it.
<div class="dialogueBox">
<div class="speakerName">You</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
"…Are you asking for food?"
</div>
</div>
The owl straightens immediately—wings fluffing, chest puffing, eyes suddenly bright with triumphant excitement—
as if you’ve finally solved the most obvious puzzle in the world.
<div class="dialogueBox">
<div class="speakerName">Owl</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
*Hoo!*
</div>
</div>
Something between a chirp and a demand.
You blink at it.
<div class="dialogueBox">
<div class="speakerName">You</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
I don’t… even know what owls eat
</div>
</div>
The owl’s head whips toward your desk.
Then back to you.
Then to the desk again.
You follow its gaze.
There—sitting where you dropped it last night—is a half-finished granola bar.
You narrow your eyes.
<div class="dialogueBox">
<div class="speakerName">You</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Absolutely not
</div>
</div>
The owl opens its beak and lets out a dramatic, offended screech—
a full-body how dare you noise that would be terrifying if it weren’t coming from something the size of a pillow.
<div class="dialogueBox">
<div class="speakerName">You</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
No
</div>
</div>
You say firmly, crossing your arms.
The owl flops onto its belly in exaggerated despair, wings spilling out dramatically, as if reenacting a silent death scene purely out of spite.
You pinch the bridge of your nose.
<div class="dialogueBox">
<div class="speakerName">You</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Fine. I’ll find you something actually edible.
</div>
</div>
Instant resurrection.
It pops upright, feathers pristine, eyes gleaming with victory.
You can practically feel it saying:
Finally. Took you long enough.
The tiny terror hops to the edge of your bedframe, waiting expectantly—
as if this was always part of the arrangement.
[[Find something edible]]<<set $returnPassage = passage()>>
Dear <<print $name>>,
We are pleased to inform you that you have been accepted to attend Hexmoor Academy for Arcane Study, located within the northern English hills, for the upcoming academic cycle. You have been selected to begin formal training as an adult practitioner of the arcane arts.
As you may already know, untrained spellcasting is strictly prohibited outside of licensed institutions as outlined in the United Kingdom Magical Practice Act of 1907. Hexmoor Academy provides a legally authorised environment in which you will learn, develop, and responsibly refine your magical abilities under the guidance of accredited faculty.
Your induction day is scheduled for 1 September. Students are expected to arrive at Briarwick Station no later than 10:45 a.m., where you will be escorted to the Academy grounds.
A list of required books, materials, and recommended personal equipment is included below.
Students may also bring one approved companion creature, provided it is registered and non-aggressive. Common choices include:
a fox-sprite, a messenger owl, or a moss-toad.
We look forward to welcoming you to Hexmoor and guiding you through the disciplined study and exploration of your innate magic.
Yours faithfully,
Headmaster Aldric Thornwell
Hexmoor Academy for Arcane Study
[[Next]]
<<set $returnPassage = passage()>>
Uniform (All Students):
- Reactive House Robes
- Three sets of plain dark work-robes (standard adult fit)
- One formal pointed hat (black or deep charcoal)
- One pair of reinforced gloves
- One winter cloak
Course Books:
- The Principles of Channelcraft by Marwen Alderholt
- Runic Logic: Foundations of Ancient Script by Orin Feldwright
- Elemental Dynamics & Natural Forces by Elyra Thorn
- Fundamentals of Alchemy & Mixturecraft by Rowan Vell
- A Field Guide to Common & Uncommon Creatures by Dr. Lyneth Marrow
- Applied Charms & Everyday Spellforms by Cillian Drex
- Protective Magics & Countermeasures by Seraphine Locke
- Transmutation Theory for Adult Practitioners by Idris Calder
- The History of Arcane Governance in the United Kingdom by Dorian Merriweather
Other Equipment:
- 1 wand (registered and attuned)
- 1 cauldron (iron or steel, standard size 2)
- 1 set of glass phials (non-reactive)
- 1 set of calibrated brass or silver scales
- 1 arcane planner folio (non-spellcasting model)
- 1 basic alchemy kit (approved components only)
[[Last One]]<<set $returnPassage = passage()>>
Dear <<print $name>>,
I hope this letter finds you well after your initial notice of acceptance. I understand that such news—particularly when unexpected—can be overwhelming. Rest assured, you are not alone in this transition.
I would like to speak with you in person regarding your admission, your background, and the steps ahead.
Please meet me at The Thistle & Wand on the afternoon of August 5th. I will be waiting for you in the back room, and you will be able to recognise me easily.
Everything will be explained when we meet.
Until then, keep your acceptance letter safe.
And remember non-gifted perception cannot always be trusted. Magic bends the familiar around places it wishes to hide.
Sincerely,
Professor Clarissa Hawthorne
[[Ask the owl what it wants]]--------------[[Wait for tomorrow]]<<set $returnPassage = passage()>>
You stand, the owl watching you with the kind of intense expectation normally reserved for royalty awaiting a meal.
Your feet hit the cold floor as you cross the room and pull open the small cupboard beside your desk.
Inside: crumbs, an empty mug, a packet of instant noodles, and something that *might* once have been fruit.
Not helpful.
You move to the kitchen.
The owl hops after you—
no flapping, no hesitation—
just a determined little strut across the floorboards, talons clicking like impatient tapping.
Inside the fridge isn’t much better.
A few leftovers.
A nearly expired yogurt.
And a container of rotisserie chicken you meant to finish yesterday.
You pause.
The owl, standing at your feet, slowly… deliberately… lifts one foot and taps the fridge door.
Just once.
A clear **that one** gesture.
You sigh, pull the container open, and tear off a small piece of chicken.
You crouch and offer it out.
<div class="dialogueBox">
<div class="speakerName">You</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Here. Real food.
</div>
</div>
The owl lights up—eyes wide, feathers puffing—
and snatches the chicken with surprising delicacy before hopping back a step to enjoy it.
It eats with the efficiency of someone who has *strong opinions* about breakfast.
Another piece disappears.
Then another.
Finally, with a satisfied trill, it shakes out its wings, gives you a proud little nod, and hops onto a nearby chair.
For a moment, you think that’s it.
Then it strides across the cushion, climbs up onto the backrest, spreads its wings—
and with a smooth leap, launches itself into the air.
It circles once around the kitchen, the tips of its wings brushing the light—
then swoops back toward your bedroom.
By the time you follow, the owl is perched neatly on your bedframe again, feathers immaculate, posture composed.
It gives a final soft *hoot*—
a goodbye, or a good-luck,
you can’t quite tell—
—and with a smooth beat of its wings, it lifts off and disappears out the open window.
You stand there for a long moment, the room strangely quiet without it.
Something has begun.
And now… it’s your move.
[[Wait for tomorrow]]<<set $returnPassage = passage()>>
The next morning arrives faster than you expect.
You barely remember falling asleep—just the quiet weight of anticipation settling over your chest, the way your thoughts kept looping around the same anchor:
The Thistle & Wand. This afternoon. Meet Professor Hawthorne.
But morning breaks with restless energy buzzing under your skin.
Waiting until afternoon feels impossible.
So you leave early.
London is its usual blur of movement—cars humming, crowds shifting, voices blending into one endless, tangled soundscape. You keep checking the scribbled directions you copied from the letter… yet somehow every turn feels wrong.
The street names blur.
The landmarks don’t line up.
You retrace your steps twice.
Then again.
Eventually you end up standing at a crossroads, staring helplessly at a row of old brick buildings that definitely shouldn’t all look exactly the same.
A frustrated sigh escapes you.
<div class="dialogueBox">
<div class="speakerName">You</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
This is ridiculous…
</div>
</div>
You glance down at the paper in your hand, as if the ink might rearrange itself into clearer instructions.
It doesn’t.
You shift your weight, trying to remember the letter’s exact wording—
“Non-gifted perception cannot always be trusted. Magic bends the familiar around places it wishes to hide.”
And apparently it bends you into walking in circles.
You rub your hands over your face.
<div class="dialogueBox">
<div class="speakerName">You</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
I left early so I wouldn’t be late. Now I’m just… lost.
</div>
</div>
A soft sound answers you.
fwip fwip fwip—
the familiar beat of wings cutting the air.
[[You turn]]<<set $returnPassage = passage()>>
There—drifting down through the morning light like it owns the sky—is the owl.
It lands neatly on a lamppost beside you, feathers puffed with quiet authority.
Its golden eyes sweep over you once before it emits a purposeful—
<div class="dialogueBox">
<div class="speakerName">Owl</div>
<div class="dialogueDivider"></div>
<div class="dialogueText"> Hoot. </div>
</div>
Another—sharper this time.
<div class="dialogueBox">
<div class="speakerName">Owl</div>
<div class="dialogueDivider"></div>
<div class="dialogueText"> HOOt! </div>
</div>
You blink.
<div class="dialogueBox">
<div class="speakerName">You</div>
<div class="dialogueDivider"></div>
<div class="dialogueText"> Don’t tell me you’re here to show me the way. </div>
</div>
The owl hops once on the metal bar.
Then spreads its wings and glides down to perch on a street sign.
It looks back at you.
Waits.
Then—
<div class="dialogueBox">
<div class="speakerName">Owl</div>
<div class="dialogueDivider"></div>
<div class="dialogueText"> Hoo. </div>
</div>
A clear message, even without language.
You let out a breathy, disbelieving laugh.
<div class="dialogueBox">
<div class="speakerName">You</div>
<div class="dialogueDivider"></div>
<div class="dialogueText"> …Fine. Lead on. </div>
</div>
The owl launches into the air—smooth, confident, weaving through the London morning like it’s done this a thousand times.
Every few metres it glances back, making sure you’re following.
You trail after it, weaving through crowds, past shops that seem to *shift* at the edges of your awareness.
And then—
The owl lands atop a small, soot-darkened sign above a pub wedged tightly between a bookshop and a record store.
You blink.
You swear this building was not here a moment ago.
The sign reads:
**THE THISTLE & WAND**
The wood is old.
The door is warped.
The windows are grime-fogged, barely reflecting the street’s light.
But as you stare, something inside your mind tugs—
a veil gently parting, revealing what was always there.
The owl gives one last triumphant farewell:
<div class="dialogueBox">
<div class="speakerName">Owl</div>
<div class="dialogueDivider"></div>
<div class="dialogueText"> HOO! </div>
</div>
Then it takes off into the sky, leaving you standing before the place where your life is about to change.
[[Enter the Thistle & Wand]]<<set $returnPassage = passage()>>
The moment you push open the warped wooden door, the outside world muffles behind you as if someone has lowered a curtain.
Warm, dim light spills across the floorboards—thick and honey-gold, flickering gently from lanterns mounted along the walls. The scent hits you first: a mix of old wood, herbs, a hint of smoke, and something savoury simmering slowly in the back. It’s comforting in a way you can’t explain, like stepping into a memory that doesn’t belong to you.
The pub is small but impossibly full of life.
Tables are scattered unevenly across the room, their legs mismatched, their surfaces etched with decades—maybe centuries—of scratches, initials, spills, and charm-burn marks. A low murmur of conversation hangs in the air: quiet, private, warm. People in cloaks of every colour sit hunched over steaming mugs and worn books, talking in low, familiar voices.
No one looks surprised to see you.
In fact…
most barely glance up, though a few pairs of curious eyes linger just long enough to make your stomach flip before returning to their drinks.
Behind the counter stands a long, polished oak bar. It’s stacked with bottles that shimmer in colours you’ve never seen in any liquor aisle—some glowing faintly, others swirling like storm clouds in glass. A kettle whistles softly somewhere in the back, accompanied by the clatter of utensils and what sounds suspiciously like a cauldron bubbling.
The air hums.
Not loudly.
Not dramatically.
Just subtly—like the faint electrical buzz you get right before a storm touches down.
Magic.
It clings to the room like dust motes dancing in the lanternlight.
A few patrons sit alone, ink-stained fingers wrapped around parchment or half-finished letters. A trio of witches argue in hushed tones over a glowing map spread across their table. A hooded man at the back absently stirs a spoon in a mug that appears to stir itself when he stops.
Despite its worn edges and cramped corners, the place feels alive—
warm, lived-in, and waiting.
You take a step forward, boots sinking into a rug so old its colours have faded into soft, muted echoes. The warmth from the hearth on the far wall brushes your skin, chasing away the morning chill that followed you inside.
And then you notice it:
A table near the corner.
Empty.
Neat.
As though someone cleaned it recently and left it untouched for one particular person.
For you.
Sunlight breaks weakly through the cloudy windows, landing in a soft beam directly across its surface.
Your pulse quickens.
This is where she asked you to meet her.
Professor Hawthorne.
A place in a world you didn’t know existed a week ago.
[[Take a seat and wait]]<<set $returnPassage = passage()>>
<<run $("#questBtn").show();>><<run $("#relationshipBtn").show();>>
<<set $showQuests = true>> <<set $showRelationships = true>>
The pub door opens again, letting in a wash of cooler air.
A woman steps inside—tall, self-assured, wrapped in a long, deep-green coat that moves as though it remembers wind even indoors. Her boots strike the floor with quiet precision. Dark hair, loosely tied back, escapes in soft curls around her face; her eyes sweep the room with the practiced sharpness of someone who misses nothing.
You can feel the shift immediately.
Not because she looks strange—
if anything, she blends in effortlessly—
but because the room reacts to her.
The barkeep straightens a little.
A few patrons bow their heads politely.
A man in the corner hurriedly folds away a newspaper as though out of respect.
Her gaze moves calmly across the pub—
methodical, searching—
passing over tables, chairs, patrons…
Then it lands on you.
Something in her expression changes—
not surprise, not recognition,
but a kind of quiet acknowledgment
as though she’s been expecting you exactly here, exactly now.
She approaches, her coat brushing softly behind her, and stops at your table.
A warm, steady voice breaks the moment.
<div class="dialogueBox"> <div class="speakerName">???</div> <div class="dialogueDivider"></div> <div class="dialogueText"> You must be <<print $name>>. </div> </div>
She offers a small, sincere smile—professional, but not unfriendly.
<div class="dialogueBox"> <div class="speakerName">Professor Clarissa Hawthorne</div> <div class="dialogueDivider"></div> <div class="dialogueText"> I’m Professor Hawthorne. I believe you’ve been waiting for me. </div> </div>
The world tilts quietly around you—
not with fear, but with the dizzying sense that the next chapter has finally begun.
[[Wow]]-------------[[What's going on?]]<div style="text-align:center;">
<h2>Professor Clarissa Hawthorne</h2>
</div>
Age: Appears to be in her late thirties
House: Skyreach
Pronouns: She/Her/Hers
Relation to you: <<print $clarissaRelation>>
Height & Build: 6ft, poised figure with a confident, upright posture
Face: Sharp, refined features; high cheekbones; observant grey-green eyes that take in everything at a glance
Hair: Dark chestnut brown, long and slightly wavy, usually tied back in a loose, functional half-tail
Skin: Warm ivory complexion with a faint dusting of freckles across her nose and cheeks
Expression: Calm, composed, with a hint of dry amusement that suggests she expects competence from those around her
Clothing: Deep forest-green travel cloak over practical mage robes; leather satchel slung cross-body; sleeves rolled slightly as if she’s prepared for hands-on work
Breast Size: Moderately full chest, proportional to her frame
Hips & Figure: Soft hourglass shape with naturally rounded hips
Arse: Rounded and proportional, the shape more a result of her posture and overall build than emphasized in any way
Genitals: <<print $profHawthorneGenitals>>
<<link "Return">><<goto Relationships>><</link>><<set $returnPassage = passage()>> <<set $profHawthorneRelation += 1>>
<<run addRelationship("Professor Clarissa Hawthorne", 38, "human")>>
She sits across from you with a quiet, composed grace, folding her hands on the table as though this meeting is simply an expected part of her day. Her eyes study you—not harshly, not judgementally, but with the practiced attentiveness of someone who has been evaluating students for many years.
Your throat goes tight for a moment, and before you can stop yourself, the word slips out.
<div class="dialogueBox">
<div class="speakerName">You</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Wow…
</div>
</div>
For the briefest moment, something flickers across her face—
a quiet, almost surprised warmth.
Not flustered.
Not dismissive.
Just… gently pleased.
Her smile softens at the edges as she inclines her head, accepting the compliment without leaning into it.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
That’s kind of you to say. But truly—there’s no need to be nervous. New students often react strongly to all of this. You’ve handled more than most before even stepping through our doors.
</div>
</div>
Professional.
Composed.
But undeniably flattered.
She adjusts the parchment folder she brought with her, placing it gently between you both.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
But we do have quite a bit to discuss—your letter, your… awakening, and what comes next for you.
</div>
</div>
Her tone is steady, reassuring, the kind used by someone who has guided countless young mages through their first steps into the magical world.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Do you have any questions for me before we move on?
</div>
</div>
[[Hexmoor Academy]]--------[[Her]]--------[[My Parents]]--------[[Move On]]<<set $returnPassage = passage()>><<run addRelationship("Professor Clarissa Hawthorne", 38, "human")>>
She settles into the chair across from you, posture straight but not rigid, hands folding neatly atop the table. The hum of the pub fades into the background as her attention focuses on you alone—calm, patient, expectant.
You don’t wait.
You can’t.
<div class="dialogueBox">
<div class="speakerName">You</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
What’s going on? Why am I here?
</div>
</div>
She nods once, as though she anticipated exactly this.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
A fair question—and the right one to start with. This isn’t something anyone should be expected to navigate alone. That’s why I contacted you.
</div>
</div>
She opens a slim parchment folder, revealing carefully organised documents and notes.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
You’ve been accepted to Hexmoor Academy, but your situation is… unusual. You weren’t raised with any understanding of the mage world, and that means you’ll need guidance.
</div>
</div>
Her voice softens slightly—still firm, still professional, but undeniably kind.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
I’m here to give you that guidance. And to answer every question you’re ready to ask.
</div>
</div>
[[Hexmoor Academy]]--------[[Her]]--------[[My Parents]]--------[[Move On]]
<<set $returnPassage = passage()>>
<div class="dialogueBox">
<div class="speakerName">You</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Could you… tell me more about the Academy? What it actually is?
</div>
</div>
Professor Hawthorne relaxes slightly, as if this is the question she always expects first.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Hexmoor Academy is the primary institution for adult magical education in the UK.
Students arrive between eighteen and twenty-five, once their magical signatures have stabilised.
You’ll learn spellcraft, magical ethics, elemental manipulation, defensive arts, and applied theory.
</div>
</div>
She taps the folder lightly.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
It’s demanding, yes. But it’s also one of the safest environments for awakening mages to grow without
harming themselves—or others. The curriculum is structured, but the journey is your own.
</div>
</div>
[[Her]]--------[[My Parents]]--------[[Move On]]<<set $returnPassage = passage()>>
<div class="dialogueBox">
<div class="speakerName">You</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
What about you? What do you actually… do?
</div>
</div>
A small smile tugs at the corner of her mouth—subtle, but genuine.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
I’m a Senior Mentor and one of the Academy’s specialist instructors.
My focus is magical regulation, awakening assessment, and early skill development.
I’m usually the first point of contact for new mages who weren’t raised in the gifted world.
</div>
</div>
She pauses—measured, thoughtful.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
I’m here to make your transition structured, safe, and as painless as possible.
The gifted world can be… overwhelming. You won’t face it alone.
</div>
</div>
[[Hexmoor Academy]]--------[[My Parents]]--------[[Move On]]<<set $returnPassage = passage()>>
<div class="dialogueBox">
<div class="speakerName">You</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
My parents… they never told me anything about magic.
Why didn’t they? What does that mean?
</div>
</div>
Professor Hawthorne’s expression softens immediately.
Not with pity—
but with the kind of careful respect reserved for painful truths.
She closes the folder gently, giving you her full attention.
<<if $bloodstatus is "Arcane-Locked">>
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Arcane-Locked individuals are born to non-gifted parents.
Your parents couldn’t have told you anything—
the Veil prevents non-gifted minds from recognising magic clearly.
Any signs you showed would have softened into harmless coincidences.
Their silence wasn’t a decision. It was the world they lived in.
</div>
</div>
<<elseif $bloodstatus is "Mixed-Line">>
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Mixed-Line families are varied.
Sometimes one parent is gifted and the other non-gifted,
and the gifted parent chooses not to reveal their world—
out of caution, fear, or promises made long ago.
Other times, magical bloodlines lie dormant for generations
until someone like you awakens them again.
<br><br>
Whatever the case, their silence wasn’t a judgement on you.
It was a consequence of circumstance… or of choices you never got to hear explained.
</div>
</div>
<<elseif $bloodstatus is "Deepborn">>
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Deepborn heritage usually comes with tradition—and heavy expectations.
If your parents kept it from you, it wasn’t accidental.
It means there were reasons: protection, exile, fractured lineage…
or something in your family history they didn’t want resurfacing.
Whatever they were carrying, they carried it alone to the end.
</div>
</div>
<<else>>
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Whatever your past holds, you won’t have to face it alone.
</div>
</div>
<</if>>
She pauses—not withdrawing, but offering space.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
I’m sorry you never had the chance to ask them.
But their absence doesn’t end your story.
You still deserve answers—and I will help you find them.
</div>
</div>
[[Hexmoor Academy]]--------[[Her]]--------[[Move On]]
<<if !$questGiven_Lineage>>
<<set $questGiven_Lineage = true>>
<<run addQuest(
"Trace Your Lineage",
"Professor Hawthorne promised to help me uncover the truth.",
[
"Speak with Hawthorne when the time is right",
"Follow any clues she reveals",
"Piece together what my parents never told me"
]
)>>
<</if>><<set $returnPassage = passage()>>
Professor Hawthorne watches you for a long, steady moment—long enough for the silence to settle, but not long enough for it to become uncomfortable. Her expression remains composed, but there’s a gentleness behind it now, something steadier, more grounded.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
That’s quite a lot for one morning.
If you have more questions later, ask them.
But for now… I think that’s enough.
</div>
</div>
You open your mouth—instinct, habit, confusion, all trying to rise at once—
but nothing comes out.
Not because you’re silenced,
but because you realise she’s right.
Your chest feels a little too full, your thoughts stretched thin.
Everything she’s told you is already pressing hard against the edges of what you can process.
You manage a small nod.
<div class="dialogueBox">
<div class="speakerName">You</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
…Yeah. No more questions. Not right now.
</div>
</div>
A faint, approving warmth touches her features—subtle, but genuine.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Good. Then let’s move forward.
You need supplies, orientation, and a proper introduction to the gifted world.
</div>
</div>
She retrieves a slim parchment envelope from her satchel and places it between you both.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
This will help you get started.
And I’ll be with you for the first steps—you won’t be navigating this alone.
</div>
</div>
Her voice gains a subtle firmness, a quiet confidence that settles into your chest like a weighted blanket.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
When you’re ready… we’ll head to the market district.
It’s time you saw where the gifted world hides.
</div>
</div>
The room feels different now—
not smaller, not quieter,
but somehow clearer.
[[Your path is beginning.]]<<set $returnPassage = passage()>>
You take a slow breath, steadying yourself.
The envelope sits between you and Hawthorne like a quiet invitation—
not a command, not a demand—just a door waiting for you to walk through it.
You close your fingers around it.
<div class="dialogueBox">
<div class="speakerName">You</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
…I’m ready.
</div>
</div>
Hawthorne nods once, a subtle but approving gesture, then rises smoothly from her seat.
She adjusts her coat, retrieves her satchel, and gestures toward the door with a quiet, confident sweep of her hand.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Then stay close. The market district isn’t far—but getting to it is a different matter.
</div>
</div>
You follow her toward the front of the pub.
A few patrons glance up as she passes—recognition, respect, maybe even relief—
but no one stops her.
The barkeep gives a small nod, one Hawthorne returns without breaking stride.
When she reaches the door, she pulls it open and steps out into the muted London afternoon.
You step out after her—
and the air shifts immediately.
The familiar noise of the city rolls around you…
but there’s something different, something faintly charged beneath it,
a quiet hum that wasn’t there before.
Hawthorne stands at the edge of the pavement, watching the flow of people and traffic with the kind of ease that suggests she already knows where you’re going… and where you’re not.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
The gifted world doesn’t sit in plain sight.
It bends. It hides.
It waits for those who know how to look.
</div>
</div>
She turns her head slightly, grey-green eyes settling on you.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
And today, you learn how to look.
</div>
</div>
She steps off the curb, coat trailing behind her as she heads into the bustling street.
You tighten your grip on the envelope and follow.
[[Follow Professor Hawthorne]]<<set $returnPassage = passage()>>
You keep close to Hawthorne as she weaves through the crowds, her stride purposeful but unhurried. She doesn’t check to see if you’re keeping up—she simply expects that you will.
London blurs around you—traffic noise, hurried footsteps, the faint smell of coffee drifting from a nearby café. Everything feels ordinary, painfully ordinary, until Hawthorne slows beside a narrow storefront squeezed between a locksmith and a discount pharmacy.
It’s a tired, glass-front charity shop.
Mannequins in outdated clothes stand in the dusty window display. Posters curl at the edges. A handwritten sign advertises a sale on mismatched dinnerware.
Completely unremarkable.
Except… it isn’t.
The reflection in the window is wrong.
Your reflection lags behind your movements.
The pavement behind you bends at an impossible angle.
And the shop interior reflected in the glass is different from the one visible through it.
Your chest tightens.
Hawthorne notices the exact moment you sense it.
A subtle, approving flicker crosses her expression.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Good. Most non-gifted walk straight past this place.
Veilwork relies on what the mind expects.
Yours isn’t falling for it.
</div>
</div>
She steps closer—not touching the glass—just raising her hand a few centimetres away from it.
A resonant vibration hums through the air.
The reflection shivers—
like a disturbed pond surface trying to settle.
Then it stills again…
waiting.
Hawthorne tilts her head toward the distorted surface.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Veils respond to resonance—intent, potential, the spark you carry.
This one is listening.
</div>
</div>
Your pulse quickens.
You raise your hand and—before you make contact—the surface bends inward.
[[Continue|Veil_Opens]]<<set $returnPassage = passage()>>
<<run $("#inventoryBtn").show();>><<set $showInventory = true>>
The glass ripples inward, folding around your presence like fabric collapsing toward heat.
A thin vertical seam splits the reflection—dark, soft, impossibly deep.
Light leaks through the gap from somewhere beyond, warm and golden, carrying faint notes of parchment, herbs, and something metallic.
The seam widens at your nearness, responding to you alone.
Hawthorne studies the reaction, and for the first time today, true approval warms her expression.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
First try.
That’s more than uncommon—it’s promising.
</div>
</div>
The seam blossoms outward, unfurling into a tall doorway made of sliding light and shadow.
No hinges. No frame.
Just possibility shaped around your presence.
Your breath catches as you step through—
—into a marketplace alive with magic.
Cobblestones warm beneath your feet.
Floating lanterns drift lazily overhead.
Shops tilt at impossible angles yet feel welcoming.
Steam rises from potion stalls.
Glass charms chime on invisible breezes.
People notice you:
A robed mage pauses mid-gesture.
A pair of students whispers urgently.
A vendor glances over, assessing, curious.
Hawthorne stands beside you, her presence grounding the sudden rush of sensation.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Welcome to the Hexmarket District.
Your first true step into our world.
</div>
</div>
She gestures toward the winding rows of stalls and enchanted shopfronts.
<div class="dialogueBox"> <div class="speakerName">Professor Clarissa Hawthorne</div> <div class="dialogueDivider"></div> <div class="dialogueText"> Where would you like to begin? </div> </div>
[[I have no money]]<<set $returnPassage = passage()>>
<<run $("#inventoryBtn").show();>>
What do you want to do first?
<<if !$robesDone>>
[[Buy your robes]]
<<else>>
• Robes — ✔ Completed
<</if>>
<<if !$wandDone>>
[[Get your wand]]
<<else>>
• Wand — ✔ Completed
<</if>>
<<if !$booksDone>>
[[Purchase your textbooks]]
<<else>>
• Textbooks — ✔ Completed
<</if>>
<<if !$petsDone>>
[[Look at pets]]
<<else>>
• Creature Companions — ✔ Completed
<</if>>
<<if $robesDone and $wandDone and $booksDone and $petsDone>>
[[Continue|Everything purchased]]
<</if>><<set $returnPassage = passage()>>
You turn down a quieter lane of the Hexmarket, where cloth banners sway despite the still air.
A sign carved into dark wood hangs above a narrow doorway:
THATCH & THREAD
Robemakers for the Gifted World
Hawthorne stops just behind you, her voice low but warm.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
You’ll need your full uniform. Robes, cloak, gloves, the lot.
</div>
</div>
You push open the door.
Warm lavender-scented air envelopes you.
Floating bolts of fabric drift around the shop like slow-moving constellations.
Measuring tapes whip through the air with alarming enthusiasm.
A wiry tailor emerges from behind a mannequin, eyes bright and sharp.
<div class="dialogueBox">
<div class="speakerName">Tailor Thatch</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Student? Unsorted?
Excellent.
Step into the light — I need to see your aura.
</div>
</div>
You comply, stepping onto a faintly glowing circle on the floor.
Immediately, your reflection in a nearby mirror flickers—
your outline shifting into faint colours:
embers of orange, streaks of violet, flickers of blue, ripples of green.
Thatch’s eyebrows jump.
<div class="dialogueBox">
<div class="speakerName">Tailor Thatch</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Oh, you’re lively.
Reactive resonance before sorting?
That’s… rare.
</div>
</div>
A tape measure darts around you and on it's own a quill takes notes on a floating clipboard.
<<if $height < 64>> <!-- under 5'4" -->
<div class="dialogueBox">
<div class="speakerName">Tailor Thatch</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Compact frame. Excellent. Robes flow better on those closer to the ground — fewer trip hazards.
</div>
</div>
<<elseif $height < 70>> <!-- 5'4" to 5'9" -->
<div class="dialogueBox">
<div class="speakerName">Tailor Thatch</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Average height. Easy work — most of the mannequins are built for your proportions.
</div>
</div>
<<else>> <!-- taller than 5'10" -->
<div class="dialogueBox">
<div class="speakerName">Tailor Thatch</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Tall. Very tall. I’ll need to lengthen the hem—don’t look so smug, it’s extra threadwork.
</div>
</div>
<</if>>
<<switch $bodyType>>
<<case "Average">>
<div class="dialogueBox">
<div class="speakerName">Tailor Thatch</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Average build — reliable proportions. Robes love people like you; they behave themselves.
</div>
</div>
<<case "Slim">>>
<div class="dialogueBox">
<div class="speakerName">Tailor Thatch</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Slim frame — elegant lines, minimal bunching. Robes will drape like you’re walking through a portrait.
</div>
</div>
<<case "Athletic">>>
<div class="dialogueBox">
<div class="speakerName">Tailor Thatch</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Athletic structure — good posture, controlled stance. The fabric will try to match your discipline.
</div>
</div>
<<case "Broad">>>
<div class="dialogueBox">
<div class="speakerName">Tailor Thatch</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Broad build — strong shoulders. I’ll reinforce the seams; broad students tend to look heroic without trying.
</div>
</div>
<<case "Curvy">>>
<div class="dialogueBox">
<div class="speakerName">Tailor Thatch</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Curved silhouette — excellent. The robes will follow your shape naturally; you’ll look like a catalogue model.
</div>
</div>
<</switch>>
A set of jet-dark robes floats toward you.
Only when they pass under the lanternlight do you see the truth:
The seams shift colour — the same cycle as your aura.
Soft, subtle, never settling.
*Reactive House Robes.*
Thatch’s voice is almost reverent.
<div class="dialogueBox">
<div class="speakerName">Tailor Thatch</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
These will adapt perfectly once your house is chosen.
Until then, they’ll anticipate you.
Don’t let them get bored.
</div>
</div>
Behind them, more items glide forward:
- **Three sets of plain dark work-robes**
- **A formal pointed hat** in deep charcoal
- **Reinforced spell-resistant gloves**
- **A winter cloak with silver fastenings**
Hawthorne watches quietly, clearly evaluating how you handle the sight.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
This is the complete Hexmoor uniform.
It should serve you well.
</div>
</div>
Thatch taps the floating bundle with a finger.
<div class="dialogueBox">
<div class="speakerName">Tailor Thatch</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Fifteen gold for the full set.
Reactive surcharge waived — first-year privilege.
</div>
</div>
[[Pay and leave|RobesExitHandler]]<<set $returnPassage = passage()>>
You and Hawthorne wind through the Hexmarket’s lantern-lit paths until she stops before a narrow storefront wedged between a potion brewer and a rune-engraver.
Its sign reads:
SOLIVAN ARCTURUS — ARTISAN OF CHANNELING INSTRUMENTS
_Not wands. Instruments._
Inside, the air smells of resin, ozone, and something faintly metallic—like the breath before lightning strikes.
The room is dim, lit by glass orbs that pulse in slow, rhythmic waves.
Not a single wand is on display.
Instead:
wood samples suspended in levitation rings,
cores sealed in crystal vials,
twisting diagrams burned into slate walls.
A man steps from the back room—tall, silver-streaked hair tied at the nape, goggles pushed up onto his forehead. His coat is layered with tool loops, etched spellplates, and faint scorch marks.
He looks you over with a sharp, discerning gaze.
<div class="dialogueBox">
<div class="speakerName">Solivan Arcturus</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
You’re new.
Good. New mages don’t come in here with bad habits.
</div>
</div>
Hawthorne inclines her head in greeting—but Solivan barely acknowledges her. His attention has zeroed in entirely on you.
He gestures to a circular platform embedded in the floor.
<div class="dialogueBox">
<div class="speakerName">Solivan</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Stand in the locus. Don’t touch anything.
Don’t flinch.
And whatever happens—don’t try to direct the magic.
</div>
</div>
Hawthorne murmurs:
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Trust the process. Arcturus is the best in the district.
</div>
</div>
[[Step into the circle]]<<set $returnPassage = passage()>>
The farther you follow the quiet lanes of the Hexmarket, the more the world seems to soften around you — lanterns dimming, voices thinning, until you reach a narrow storefront nestled between two leaning buildings.
A wooden sign dangles overhead, etched in curling script:
INKWELL & IVY
Textbooks • Tomes • Arcane Reference
Hawthorne rests a hand briefly on your shoulder.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Everything you’ll need for your first year is inside.
I’ll wait near the entrance — go on.
</div>
</div>
You step through the door.
Warm, dusty air surrounds you, carrying the smell of old parchment and spell-ink. Shelves tower overhead, each one bowed under the weight of dense tomes and shimmering manuals. A few books hover on their own, drifting lazily until they slide back into place with quiet satisfaction.
You find a section labelled **First-Year Curriculum** and begin pulling the required titles:
- **The Principles of Channelcraft** — Marwen Alderholt
- **Runic Logic: Foundations of Ancient Script** — Orin Feldwright
- **Elemental Dynamics & Natural Forces** — Elyra Thorn
- **Fundamentals of Alchemy & Mixturecraft** — Rowan Vell
- **A Field Guide to Common & Uncommon Creatures** — Dr. Lyneth Marrow
- **Applied Charms & Everyday Spellforms** — Cillian Drex
- **Protective Magics & Countermeasures** — Seraphine Locke
- **Transmutation Theory for Adult Practitioners** — Idris Calder
- **The History of Arcane Governance in the United Kingdom** — Dorian Merriweather
Your arms are nearly full by the time you reach for the final book.
Your hand brushes someone else’s.
A warm, solid touch — electric with surprise.
Both of you jerk back at once, your books wobbling in your grasp.
A loose parchment slips between you and drifts to the floor.
You look up.
A figure stands beside you —
another student, robes already fitted, expression caught between embarrassment and intrigue.
They look like they hadn't expected anyone to be here either.
The moment hangs lightly in the air —
awkward, warm, and strangely grounding.
Your pulse picks up.
<br><br>
[[You see a woman]]----[[You see a man]]<<set $returnPassage = passage()>>
The Hexmarket grows louder and stranger as you follow a narrow lane lined with brass lanterns and floating parchment signs.
A storefront catches your eye immediately.
Its sign is carved from driftwood, painted with looping script:
THE MENAGERIE OF MUNDANE & MYSTICAL BEASTS
— Licensed Familiar Breeder —
Warm light spills from the doorway. A soft chime rings as you step inside.
The scent hits you first — wood shavings, herbal feed, a faint spark of ozone.
The interior hums with quiet life.
Rows of enchanted enclosures line the walls: floating terrariums, rune-bound perches, softly glowing habitat spheres. Each one houses something alive… and curious.
A fox-sized creature made entirely of smoke curls lazily in its glass dome.
Tiny winged felines nap in a hammock of woven starlight.
A pair of miniature drakes snort harmless sparks at each other.
A middle-aged mage in apricot-coloured robes looks up from behind the counter.
<div class="dialogueBox">
<div class="speakerName">Shopkeeper</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
First-year, are you?
New students usually come wide-eyed — though you seem steadier than most.
</div>
</div>
They gesture around the shop.
<div class="dialogueBox">
<div class="speakerName">Shopkeeper</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Take your time. A familiar chooses *you*, not the other way around.
</div>
</div>
You wander the aisles, feeling dozens of small gazes turn toward you — assessing, curious, quietly hopeful.
[[Look at the creatures|Choose a Pet]]<div style="text-align:center;">
<h2>Inventory</h2>
</div>
<div class="inventory-wrapper">
<div class="inventory-section">
<h3>Gold</h3>
<p><strong><<print $gold>> G</strong></p>
</div>
<div class="inventory-section">
<h3>Items</h3>
<<if $inventory and $inventory.length eq 0>>
<p>You have no items yet.</p>
<<elseif $inventory and $inventory.length gt 0>>
<ul class="inventory-list">
<<for _item range $inventory>>
<<set _name = _item>>
<li>
<<= _name >> (x<<= $inventoryQuantities[_name] >>)
</li>
<</for>>
</ul>
<</if>>
</div>
</div>
<br>
<<link "Return">><<goto $returnPassage>><</link>>
<<set $returnPassage = passage()>>
The marketplace hums around you—warm cobblestones underfoot, drifting lanterns overhead, and winding rows of stalls that glow with subtle magic.
Hawthorne watches your reaction for a moment before reaching into her coat.
She withdraws a small leather pouch, tied neatly with dark cord, and places it into your hand.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Your starter allowance.
Hexmoor Academy provides funding to ensure every new student can afford their essential supplies.
</div>
</div>
The pouch has a satisfying weight, the coins inside shifting softly as you close your fingers around it.
<div class="dialogueBox">
<div class="speakerName">You</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
How much is this?
</div>
</div>
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Enough to cover robes, books, wandwork materials, and a few extras—if you’re careful.
</div>
</div>
<<if $bloodstatus == "Mixed-Line" or $bloodstatus == "Deepborn">>
[[Inheritance]]
<<else>>
[[Thank her|Hawthorne_Grateful]]---[[Look confused|Hawthorne_Confused]]---[[Feel awkward|Hawthorne_Awkward]]---[[Look annoyed|Hawthorne_Ungrateful]]
<</if>>
<<if !$starterAllowanceGiven>>
<<run addGold(50, "Hexmoor starter allowance")>>
<<set $starterAllowanceGiven = true>>
<</if>><<set $returnPassage = passage()>>
<<if $bloodstatus == "Mixed-Line">>
Hawthorne’s expression softens.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Your family left behind a small mundane inheritance.
Nothing magical—but still yours.
</div>
</div>
<<if !$inheritanceGiven>>
<<run addGold(25, "Family inheritance")>>
<<set $inheritanceGiven = true>>
<</if>>
<<elseif $bloodstatus == "Deepborn">>
A flicker of respect touches her features.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Deepborn families tend to plan ahead.
Your parents left behind a meaningful inheritance.
Use it responsibly.
</div>
</div>
<<if !$inheritanceGiven>>
<<run addGold(50, "Family inheritance")>>
<<set $inheritanceGiven = true>>
<</if>>
<</if>>
[[Thank her|Hawthorne_Grateful]]---[[Look confused|Hawthorne_Confused]]---[[Feel awkward|Hawthorne_Awkward]]---[[Look annoyed|Hawthorne_Ungrateful]]
<<set $returnPassage = passage()>> <<set $hawthorneFirstImpression = "grateful">>
You tighten your grip on the pouch, feeling the weight of what she and the Academy are offering you.
<div class="dialogueBox">
<div class="speakerName">You</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Thank you… really. I know you didn’t have to explain all of this.
</div>
</div>
Hawthorne’s expression softens in a way that feels rare—genuine, warm beneath her composed exterior.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
You’re welcome.
And you’re not alone in this.
Guidance is part of my role—one I take seriously.
</div>
</div>
[[Hexmarket]]
<<set $returnPassage = passage()>> <<set $hawthorneFirstImpression = "confused">>
You blink down at the pouch, bewilderment pushing through you.
<div class="dialogueBox">
<div class="speakerName">You</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
I… don’t really understand why I’m getting all this.
It doesn’t feel real.
</div>
</div>
Hawthorne tilts her head slightly, evaluating you with sharp but empathetic eyes.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Confusion is expected.
Your life shifted very quickly.
But every coin in that pouch is yours—earned by circumstance, lineage, or school support.
</div>
</div>
She steps a little closer, her voice steady and grounding.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Take a breath.
Let the world be strange for now.
Understanding will come with time.
</div>
</div>
[[Hexmarket]]
<<set $returnPassage = passage()>><<set $hawthorneFirstImpression = "awkward">>
Your mouth opens—then closes—your brain seemingly unable to choose a reaction.
<div class="dialogueBox">
<div class="speakerName">You</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Uh… wow. Okay.
I don’t really know what I’m supposed to… say?
</div>
</div>
A tiny flicker of amusement touches Hawthorne’s lips—barely visible, but unmistakable.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
You don’t need to say anything.
Most new mages freeze the first time I hand them funding.
</div>
</div>
Her voice softens, just a fraction.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Just breathe.
And try not to drop the pouch this time.
</div>
</div>
[[Hexmarket]]
<<set $returnPassage = passage()>>
You take a moment to steady yourself.
Your robes, wand, textbooks, and new companion are all accounted for — the biggest parts of your list done.
But the Hexmarket is far from finished with you.
Small stalls and narrow shops weave together in a glittering maze, each one carrying something from your remaining list:
- glass phials
- brass scales
- your cauldron
- the non-reactive starter potions kit
- an enchanted timetable folio
Hawthorne guides you through the last stretch at a brisk but manageable pace.
No long lessons.
No surprises.
Just quiet efficiency.
A cauldron maker nods once and hands you a polished pewter model.
A charmwright fits your timetable folio to your signature in a flare of soft gold.
A potion vendor wraps your kit in waxed paper and tells you not to open anything inside without supervision.
Before long, your bags feel heavier — pleasantly so.
Hawthorne watches you adjust the weight on your shoulder and gives a small nod, the closest thing to approval she’s offered all day.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
That’s everything.
Your preparations are complete.
</div>
</div>
She steps aside, allowing the view ahead to open.
The Hexmarket glows warmly before you — lanterns shifting, voices woven like threads of magic, the hum of possibility thrumming in the air.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Ready for your next step?
</div>
</div>
[[Continue|Finish Up]]
<<if !$generalEquipmentBought>>
<<run addGold(-5, "General Equipment")>>
<<run addItem("General Equipment", 1)>>
<<set $generalEquipmentBought = true>>
<</if>><<set $returnPassage = passage()>><<set $hawthorneFirstImpression = "ungrateful">>
You take the pouch, weighing it in your palm, but the gesture feels hollow.
A strange irritation rises before you can stop it—sharp, defensive, misplaced.
<div class="dialogueBox">
<div class="speakerName">You</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
This is… it? I’m just supposed to take this and pretend it fixes everything?
</div>
</div>
Hawthorne goes still.
Not tense.
Not offended.
Just still—like a mage who has heard far worse from far more difficult students.
Her eyes narrow a fraction.
Barely noticeable, but unmistakably real.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
No.
It doesn’t fix anything.
It’s not meant to.
</div>
</div>
She folds her hands, her voice shifting—
cool, measured, no longer soft or coaxing.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
It’s support.
A foundation.
A start.
Nothing more.
</div>
</div>
There’s no anger in her tone—just a quiet firmness you feel in your chest.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
You don’t have to be grateful today.
But you do have to take responsibility for the path ahead.
</div>
</div>
A subtle distance settles between you—not enough to push you away, but enough to remind you:
She expects more.
And she’ll hold you to it.
She turns, her coat shifting with the movement.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Come along.
The Hexmarket won’t wait forever.
</div>
</div>
[[Hexmarket]]<<set $returnPassage = passage()>>
The ground hums.
Not a vibration—
a recognition.
Symbols flare beneath your feet, reacting to your presence rather than Solivan’s command.
A low, resonant tone builds in the air—the sound of magic listening.
Three objects rise from the surrounding pedestals:
- A shard of crystalline root
- A coil of pale, feather-fine metal
- A piece of stone veined with faint luminescence
All rotate slowly around you, orbiting like curious moons.
Solivan’s brows lift.
<div class="dialogueBox">
<div class="speakerName">Solivan</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Hm. That’s… unusual.
They’re responding before I call them.
</div>
</div>
He flips a switch.
A windless swirl of glowing motes tightens around your hands.
The three materials collide—
not violently, but with purpose—
merging in a slow, gravitational pull.
You feel a tug deep in your chest, a subtle click in the air—
like a lock turning.
Light flares.
When it fades, a wand floats before you:
**A spiraled wand of fused driftwood and crystallized marrow, wrapped with a metallic filament that pulses faintly with life.**
Alien. Beautiful.
Unmistakably yours.
Solivan’s face changes.
The man who moments ago looked bored is now staring at your wand with a scholar’s shock.
<div class="dialogueBox">
<div class="speakerName">Solivan</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
That shouldn’t be possible.
</div>
</div>
He steps closer, inspecting it without touching.
<div class="dialogueBox">
<div class="speakerName">Solivan</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Driftwood from the Beyondshore…
Marrowstone from a ground-buried titan fossil…
And that filament—
that’s living aetheric metal.
I haven’t seen it bond in twenty years.
</div>
</div>
Hawthorne’s eyes flick sharply toward you.
Not fearful.
Not alarmed.
But wary.
And impressed.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Your affinity is stronger than I expected.
</div>
</div>
Solivan exhales through his teeth, low and deliberate.
<div class="dialogueBox">
<div class="speakerName">Solivan</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Strong?
No, Professor—this is something else entirely.
</div>
</div>
He gestures for you to take the wand.
<div class="dialogueBox">
<div class="speakerName">Solivan</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Go on.
I want to see what it does to the air when you hold it.
</div>
</div>
[[Pick up the wand]]<<set $returnPassage = passage()>>
The moment your fingers brush the wand’s surface, a pulse snaps through the air—
soundless, but not quiet.
Your breath stutters.
The world sharpens.
The wooden spiral beneath your fingertips feels warm, almost alive.
The crystallized segments shimmer faintly, like breath misting across glass.
And the metallic filament?
It moves.
Subtle, serpentlike, tightening a fraction around the wand’s core as if greeting you.
A soft ring of light expands outward from your hand, rippling the air like a stone dropped in perfectly still water.
Solivan inhales sharply.
<div class="dialogueBox">
<div class="speakerName">Solivan</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
That—
that’s resonance. On contact.
I haven’t seen that in decades.
</div>
</div>
The light fades, leaving a lingering hum beneath your skin, as though a second heartbeat has settled into your palm.
Hawthorne watches closely—too closely.
Her eyes narrow with thoughtful caution, and a flicker of something unreadable passes through them.
Not fear.
Not worry.
Recognition.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Steady. Let it settle.
A wand like that meets you before you meet it.
</div>
</div>
She steps closer, voice low.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Tell me what you feel.
</div>
</div>
The answer isn’t simple.
The wand feels like—
- a quiet storm held in stillness
- your emotions reflected back at you
- a weight and a warmth that isn’t yours but fits you anyway
- something ancient waking up
You lift it slightly.
The light around the tip sharpens—only for a moment—before fading again, like a breath drawn but not released.
Solivan circles you once, jaw clenched in thought.
<div class="dialogueBox">
<div class="speakerName">Solivan</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
I don’t like mysteries in my own shop.
And that—whatever that is—wasn’t in the materials you touched.
</div>
</div>
He looks up at Hawthorne.
<div class="dialogueBox">
<div class="speakerName">Solivan</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
You understand what this implies.
</div>
</div>
Hawthorne meets his gaze, and for a heartbeat, neither speaks.
Then:
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Not here.
Not yet.
</div>
</div>
Solivan snorts, but backs off.
Your wand settles in your grip, the hum quieting into something like contentment.
Hawthorne places a hand gently on your shoulder—guiding, steadying.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Good. Your first wand always tells a story.
Yours simply hasn’t revealed all of its chapters yet.
</div>
</div>
She nods toward the shop door.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Come on. There’s still more of Hexmarket to see.
</div>
</div>
[[Pay Solivan and leave the Atelier|WandExitHandler]]<<set $wandDone = true>>
<<run addGold(-10, "Wand purchase")>>
<<run addItem("Ancient Wand", 1)>>
<<goto "Hexmarket">><div>
<label>House:</label>
<select data-var="$house">
<option>Emberfall</option>
<option>Nightbloom</option>
<option>Skyreach</option>
<option>Mossgren</option>
<option>Unselected</option>
</select>
</div><<set $robesDone = true>>
<<run addGold(-15, "Purchased Hexmoor Uniform")>>
<<run addItem("Reactive House Robes", 1)>>
<<run addItem("Dark Work-Robes", 3)>>
<<run addItem("Formal Pointed Hat", 1)>>
<<run addItem("Reinforced Gloves", 1)>>
<<run addItem("Winter Cloak", 1)>>
<<goto "Hexmarket">><<set $playerFriend to "Alexis">> <<set $returnPassage = passage()>>
She’s young — around your age, maybe eighteen — and dressed in plain unsorted student robes.
A faint shimmer at the trim marks her as someone awaiting house placement, same as you.
Her hair falls in a loose wave over one shoulder, dark with a faint copper sheen where the lanternlight touches it. Her expression is open, warm, but also a touch embarrassed at the collision of hands.
Then she smiles — small, apologetic, but genuine.
<div class="dialogueBox">
<div class="speakerName">Alexis Vale</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Sorry — I wasn’t watching where I was reaching.
First-year nerves. Or… book-related ambush.
Could go either way.
</div>
</div>
She tucks a loose strand of hair behind her ear.
<div class="dialogueBox">
<div class="speakerName">Alexis Vale</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
I’m Alexis.
My mum’s non-gifted, but my dad’s Deepborn, so… I sort of grew up knowing this stuff existed.
Never got to *do* any of it, though.
</div>
</div>
She glances over the titles in your arms.
<div class="dialogueBox">
<div class="speakerName">Alexis Vale</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Looks like we’re in the same boat — total beginners with just enough knowledge to be dangerous.
</div>
</div>
Her eyes warm a little, curious — not flirty, not bold, just open to connection.
<br><br>
[[Talk to Alexis more]]<<set $playerFriend to "Alex">><<set $returnPassage = passage()>>
The student who bumped hands with you looks up —
a young man, also eighteen, dressed in simple unsorted academy robes.
His hair is short and dark, a little messy at the fringe as if he got caught in a gust on the way in.
His expression is caught halfway between surprise and a slightly sheepish grin.
<div class="dialogueBox">
<div class="speakerName">Alex Vale</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Oh — sorry! Didn’t mean to steal your book.
I swear it practically jumped at me.
</div>
</div>
He stoops to retrieve the parchment that drifted down, handing it back with a polite dip of his head.
<div class="dialogueBox">
<div class="speakerName">Alex Vale</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
I’m Alex. First year.
My dad’s Deepborn, mum’s non-gifted — so I kinda grew up hearing mage stuff in the background.
Never thought I’d actually be here, though.
</div>
</div>
His gaze flicks over the books in your arms.
<div class="dialogueBox">
<div class="speakerName">Alex Vale</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Guess we’re starting from the same page.
Literally.
</div>
</div>
He gives a soft laugh — not forced, not awkward; just a young guy trying to make a moment easier.
<br><br>
[[Talk to Alex more]]<div style="text-align:center;">
<h2>Alexis Vale</h2>
</div>
Age: 18
Pronouns: She/Her/Hers
House: <<print $alexisHouse>>
Relation to you: <<print $alexisRelation>>
Height & Build: 5'9"; slim-athletic, relaxed posture with quiet confidence
Face: Thoughtful features; steady slate-blue eyes that track every detail
Hair: Dark brown, straight, shoulder-length; falls into her eyes when lost in thought
Skin: Soft beige with a faint natural flush
Expression: A calm half-smile — like she already understands more than she says
Clothing: Practical student robes lined subtly with Nightbloom violet; messenger satchel ink-smudged and well-used
Breast Size: Moderate, proportional
Hips & Figure: Light curve at the waist, balanced frame
Arse: Softly rounded, understated
Genitals: <<print $alexisGenitals>>
<<link "Return">><<goto Relationships>><</link>><div style="text-align:center;">
<h2>Alex Vale</h2>
</div>
Age: 18
Pronouns: He/Him/His
House: <<print $alexHouse>>
Relation to you: <<print $alexRelation>>
Height & Build: 6'0"; lean-athletic build, relaxed posture, quietly grounded
Face: Soft but defined features; steady slate-blue eyes with thoughtful focus
Hair: Medium dark brown, slightly wavy; falls forward when he concentrates
Skin: Light beige with a faint warmth at the cheeks
Expression: Subtle, knowing half-smile — like he’s already assessed every outcome
Clothing: Practical robes marked with Nightbloom violet stitching; messenger bag worn, smudged with ink
Chest & Build: Lean, lightly toned
Hips & Figure: Slim waist, balanced proportions
Arse: Slightly rounded, naturally shaped
Genitals: <<print $alexGenitals>>
<<link "Return">><<goto Relationships>><</link>><<set $returnPassage = passage()>><<run addRelationship("Alexis Vale", 18, "human")>>
You shift your books in your arms and Alexis steps a little closer, her expression brightening now that the initial awkwardness has passed.
<div class="dialogueBox">
<div class="speakerName">Alexis Vale</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
So… are you excited? Terrified? Somewhere in the middle?
I’ve been trying to pretend I’m calm but, uh—
<i>gestures vaguely at the floating books</i>
—everything is a lot.
</div>
</div>
She laughs softly, embarrassed but trying.
[[Be friendly|AlexisFriendly]]---[[Be flirty|AlexisFlirty]]---[[Stay neutral|AlexisNeutral]]<<set $returnPassage = passage()>><<run addRelationship("Alex Vale", 18, "human")>>
Alex straightens slightly when you choose to stay and talk, shifting the books in his arms and offering a small, disarming smile.
He’s eighteen, like you. Unsorted robes. One Deepborn parent, one non-gifted — a foot in both worlds, just like Alexis.
Just like you, in some ways.
<div class="dialogueBox">
<div class="speakerName">Alex Vale</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
So… are you doing alright?
I’m telling myself I’m calm, but inside I’m definitely not calm.
</div>
</div>
Three ways to respond:
[[Be friendly|AlexFriendly]]---[[Be flirty|AlexFlirty]]---[[Stay neutral|AlexNeutral]]<<set $alexisAffinity += 1>><<set $returnPassage = passage()>><<set $alexisRelationship = "friend">>
<div class="dialogueBox">
<div class="speakerName">You</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Honestly? Same. But it’s nice knowing someone else is in the same boat.
</div>
</div>
Her shoulders ease a little, warmth spreading through her expression.
<div class="dialogueBox">
<div class="speakerName">Alexis Vale</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Yeah. Feels less scary when you’re not alone in it.
Maybe we’ll survive first term together.
</div>
</div>
[[Hawthorne notices you talking|HawthorneSeesYou]]<<set $returnPassage = passage()>><<set $alexisAffinity += 2>><<set $alexisRelationship = "romance">>
<div class="dialogueBox">
<div class="speakerName">You</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
I think I’m doing fine now.
Meeting you helped.
</div>
</div>
Alexis blinks—
then colour rises in her cheeks, subtle but unmistakable.
<div class="dialogueBox">
<div class="speakerName">Alexis Vale</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Oh. Well…
that’s—
I mean—
thank you.
</div>
</div>
She tucks her hair behind her ear again, suddenly flustered in a way that’s very, very cute.
[[Hawthorne notices you talking|HawthorneSeesYou]]<<set $returnPassage = passage()>><<set $alexisAffinity += 0>><<set $alexisRelationship = "neutral">>
<div class="dialogueBox">
<div class="speakerName">You</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
I’m just trying to get through the book list. One thing at a time.
</div>
</div>
She nods quickly, not offended—
just unsure how much you want to engage.
<div class="dialogueBox">
<div class="speakerName">Alexis Vale</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Right. Makes sense.
I’ll let you focus then.
</div>
</div>
[[Hawthorne notices you talking|HawthorneSeesYou]]<<set $returnPassage = passage()>>
As you move toward the front counter, Professor Hawthorne’s eyes rise from her quiet examination of a shelf of sealed tomes.
She watches you for a moment — long enough to read the tone of your conversation with Alexis or Alex carried in the set of your shoulders.
<<if $playerFriend == "Alexis">>
<<if $alexisRelationship == "neutral">>
Her expression remains even, patient.
<<elseif $alexisRelationship == "friend">>
Her gaze softens with quiet approval.
<<elseif $alexisRelationship == "romance">>
One brow lifts by the smallest fraction, not reprimanding, simply… noticing.
<</if>>
<<else>>
<<if $alexRelationship == "neutral">>
Her expression remains even, patient.
<<elseif $alexRelationship == "friend">>
Her gaze softens with quiet approval.
<<elseif $alexRelationship == "romance">>
One brow lifts by the smallest fraction, not reprimanding, simply… noticing.
<</if>>
<</if>>
She steps aside just enough to give you space to approach the counter.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Come along, then.
You’ll need to pay for your books before we continue.
</div>
</div>
Her tone is steady, guiding — an anchor in the overwhelming thrum of the Hexmarket.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Once that's done, we can move on to your next stop.
</div>
</div>
She gestures toward the front counter, where an elderly mage with silver spectacles is already looking up expectantly.
[[Pay for your books|PayBooks]]<<set $returnPassage = passage()>><<set $alexAffinity += 1>><<set $alexRelationship = "friend">>
<div class="dialogueBox">
<div class="speakerName">You</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Trust me, same here. It’s good knowing someone else is figuring this out too.
</div>
</div>
Alex’s smile widens, relief mixing with genuine warmth.
<div class="dialogueBox">
<div class="speakerName">Alex Vale</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Yeah. Makes it easier knowing we’re not the only ones stumbling through our first day.
</div>
</div>
[[Hawthorne notices you talking|HawthorneSeesYou]]<<set $returnPassage = passage()>><<set $alexAffinity += 2>><<set $alexRelationship = "romance">>
<div class="dialogueBox">
<div class="speakerName">You</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Honestly? Meeting you made this whole place feel a lot less overwhelming.
</div>
</div>
Alex pauses —
then a surprised, warm grin tugs at the corner of his mouth.
<div class="dialogueBox">
<div class="speakerName">Alex Vale</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Really?
Well… same. You’ve definitely improved my afternoon.
</div>
</div>
[[Hawthorne notices you talking|HawthorneSeesYou]]<<set $returnPassage = passage()>><<set $alexAffinity += 1>><<set $alexRelationship = "neutral">>
:: AlexNeutral
<<set $alexValeAffinity += 0>>
<div class="dialogueBox">
<div class="speakerName">You</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
I’m just trying to get the shopping done. That’s all.
</div>
</div>
Alex nods politely, adjusting his grip on his books.
<div class="dialogueBox">
<div class="speakerName">Alex Vale</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Fair enough.
I’ll let you focus — wouldn’t want to be the reason you forget something important.
</div>
</div>
[[Hawthorne notices you talking|HawthorneSeesYou]]
<<set $returnPassage = passage()>>
You carry your stack of books to the counter.
The elderly shopkeeper adjusts his silver spectacles as you set them down, his gaze flicking neatly across each title.
<div class="dialogueBox">
<div class="speakerName">Shopkeeper</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
First-year curriculum?
Good. A solid foundation makes all the difference.
</div>
</div>
He tallies the stack with a few swift strokes of his quill before giving a small, approving nod.
<div class="dialogueBox">
<div class="speakerName">Shopkeeper</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Total comes to twelve gold.
Student rate, of course. Hexmoor tradition.
</div>
</div>
You reach for your coin pouch.
The shopkeeper bundles your books with a simple length of twine and places them carefully on the counter.
<div class="dialogueBox">
<div class="speakerName">Shopkeeper</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Take care of them.
Knowledge opens doors you may not recognise — yet.
</div>
</div>
Hawthorne gestures lightly toward your payment pouch.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Go on. Settle your bill.
Then we’ll continue.
</div>
</div>
[[Pay the twelve gold|ProcessBookPurchase]]<<set $booksDone = true>>
<<run addGold(-12, "Books purchase")>>
<<run addItem("Year 1 Course Books", 9)>>
<<goto "Hexmarket">><<set $returnPassage = passage()>>
You slow as a few of the creatures stand out, their attention following your every movement.
**A list of potential familiars watches you intently:**
- **Aether Owl** — feathers like drifting mist, eyes glowing soft silver
- **Ember Hound Pup** — small, warm, tail flickering like a candle flame
- **Mossback Tortoise** — tiny, ancient-eyed, shell covered in blooming moss
- **Starlit Cat** — fur shimmering like constellations when it moves
The shop quiets around you — or perhaps it’s just your heartbeat growing louder.
A familiar bond begins here… if you choose to form one.
<div class="dialogueBox">
<div class="speakerName">Shopkeeper</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Go on, then.
Which one calls to you?
</div>
</div>
<div class="dialogueBox">
<div class="speakerName">Shopkeeper</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
And don't worry I will keep which ever you choose
until you are leaving for your home.
</div>
</div>
[[Choose the Aether Owl]]---[[Choose the Ember Hound Pup]]
[[Choose the Mossback Tortoise]]---[[Choose the Starlit Cat]]<<set $returnPassage = passage()>>
The Aether Owl tilts its head as you step closer, its form shimmering like moonlit fog.
Up close, it’s even stranger — feathers dissolve at the edges like drifting mist before reforming in soft pulses of light.
It studies you with silver, liquid eyes… then glides forward and presses its cool, weightless forehead to your hand.
A soft ripple moves through your skin.
Like the hush of a winter night settling in your bones.
The shopkeeper’s breath catches.
<div class="dialogueBox">
<div class="speakerName">Shopkeeper</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Aether owls choose clarity. Or… the potential for it.
That one sees something in you.
</div>
</div>
The owl climbs your forearm, settling with ghostlike lightness on your shoulder.
It hoots once — soft, melodic.
Like a question.
A name.
<div>
<label><strong>Name your Aether Owl</strong></label><br>
<input type="text" id="petNameInput" placeholder="Enter name">
</div>
<div id="petNameError" style="color: red; margin-top: 5px;"></div>
<br>
<<button "Confirm">>
<<script>>
var name = document.getElementById("petNameInput").value.trim();
if (!name) {
document.getElementById("petNameError").innerHTML = "Please enter a name.";
} else {
// Save pet info
State.variables.petName = name;
State.variables.petType = "Aether Owl";
State.variables.petsDone = true;
// Gold + Notification
addGold(-8, "Pet Purchase");
// Add relationship entry for the pet
State.variables.petInfoPassage = State.variables.petName;
addRelationship(name, 0, "pet");
// Continue
Engine.play("Hexmarket");
}
<</script>>
<</button>><<set $returnPassage = passage()>>
The Ember Hound Pup spots you instantly — its tiny tail flickering like a candle flame as it bounds straight toward your legs.
It skids to a stop, nose warm against your hand, eyes molten amber and shining with unmistakable excitement.
When you pet it, gentle embers rise from its fur — drifting harmlessly like sparks from a hearth.
Heat rolls up your arm, comforting and steady.
The shopkeeper chuckles.
<div class="dialogueBox">
<div class="speakerName">Shopkeeper</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Oh, that one’s picked you already.
Ember pups bond fast — especially to mages with strong hearts.
</div>
</div>
The pup sits beside you, tail flicking tiny sparks that dissolve before hitting the floor.
It nudges your hand again.
Waiting for a name.
<div>
<label><strong>Name your Ember Hound Pup</strong></label><br>
<input type="text" id="petNameInput" placeholder="Enter name">
</div>
<div id="petNameError" style="color: red; margin-top: 5px;"></div>
<br>
<<button "Confirm">>
<<script>>
var name = document.getElementById("petNameInput").value.trim();
if (!name) {
document.getElementById("petNameError").innerHTML = "Please enter a name.";
} else {
// Save pet info
State.variables.petName = name;
State.variables.petType = "Ember Hound Pup";
State.variables.petsDone = true;
// Gold + Notification
addGold(-8, "Pet Purchase");
// Add relationship entry for the pet
State.variables.petInfoPassage = State.variables.petName;
addRelationship(name, 0, "pet");
// Continue
Engine.play("Hexmarket");
}
<</script>>
<</button>><<set $returnPassage = passage()>>
The Mossback Tortoise sits quietly in its terrarium, moss-covered shell glowing with soft green luminescence.
Unlike the other creatures, it doesn’t rush to meet you — it simply *observes*.
But when you kneel, it begins a slow, determined walk toward your hand.
It presses its tiny head gently against your fingers.
Warmth spreads through you — earthy, grounding, like standing barefoot in rain-soaked soil.
Tiny white blossoms sprout from the moss along its shell.
The shopkeeper hums approvingly.
<div class="dialogueBox">
<div class="speakerName">Shopkeeper</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Mossbacks bond to mages who need steadiness.
Or to those who already carry it.
</div>
</div>
The tortoise nestles calmly into your palm.
Your heartbeat settles.
It looks up as though waiting… patiently… for a name.
<div>
<label><strong>Name your Mossback Tortoise</strong></label><br>
<input type="text" id="petNameInput" placeholder="Enter name">
</div>
<div id="petNameError" style="color: red; margin-top: 5px;"></div>
<br>
<<button "Confirm">>
<<script>>
var name = document.getElementById("petNameInput").value.trim();
if (!name) {
document.getElementById("petNameError").innerHTML = "Please enter a name.";
} else {
// Save pet info
State.variables.petName = name;
State.variables.petType = "Mossback Tortoise";
State.variables.petsDone = true;
// Gold + Notification
addGold(-8, "Pet Purchase");
// Add relationship entry for the pet
State.variables.petInfoPassage = State.variables.petName;
addRelationship(name, 0, "pet");
// Continue
Engine.play("Hexmarket");
}
<</script>>
<</button>><<set $returnPassage = passage()>>
The Starlit Cat lounges atop a floating night-silk cushion, fur rippling with drifting constellations.
When your shadow falls across it, its eyes open — glowing like distant galaxies.
It studies you.
Long.
Silent.
Too intelligent.
Then it moves.
In one impossibly light leap, it lands on your shoulder, tail curling behind your neck like a ribbon of stardust.
A hum fills the air — a purr that resonates like a tuning fork struck by moonlight.
<div class="dialogueBox">
<div class="speakerName">Shopkeeper</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Well now…
Starlit Cats don’t attach themselves to just anyone.
Looks like you’ve been chosen.
</div>
</div>
The cat nuzzles your jaw, constellations shifting in its fur as it looks directly into your eyes.
Waiting.
Ready for its name.
<div>
<label><strong>Name your Starlit Cat</strong></label><br>
<input type="text" id="petNameInput" placeholder="Enter name">
</div>
<div id="petNameError" style="color: red; margin-top: 5px;"></div>
<br>
<<button "Confirm">>
<<script>>
var name = document.getElementById("petNameInput").value.trim();
if (!name) {
document.getElementById("petNameError").innerHTML = "Please enter a name.";
} else {
// Save pet info
State.variables.petName = name;
State.variables.petType = "Starlit Cat";
State.variables.petsDone = true;
// Gold + Notification
addGold(-8, "Pet Purchase");
// Add relationship entry for the pet
State.variables.petInfoPassage = State.variables.petName;
addRelationship(name, 0, "pet");
// Continue
Engine.play("Hexmarket");
}
<</script>>
<</button>><div style="text-align:center;">
<h2>Relationships</h2>
</div>
<!-- FLEX CONTAINER → Forces equal-height children -->
<div style="
display:flex;
justify-content:center;
gap:40px;
margin-top:20px;
align-items:stretch; /* <-- forces divider to match height */
">
<!-- LEFT COLUMN — PEOPLE -->
<div style="width:40%; text-align:center;">
<h3>People</h3>
<div style="display:flex; flex-direction:column; gap:12px;">
<<for _char, _data range $relationships>>
<<if _data.type == "human">>
<div>
<<link _data.name _data.name>><</link>>
</div>
<</if>>
<</for>>
</div>
</div>
<!-- DIVIDER — Automatically matches height of the content columns -->
<div style="
width:4px;
background: var(--house-main, var(--cycleColor));
border-radius:3px;
"></div>
<!-- RIGHT COLUMN — COMPANIONS -->
<div style="width:40%; text-align:center;">
<h3>Companions</h3>
<div style="display:flex; flex-direction:column; gap:12px;">
<<for _char, _data range $relationships>>
<<if _data.type == "pet">>
<div>
<<link _data.name>><<goto "Pet Profile">><</link>>
</div>
<</if>>
<</for>>
</div>
</div>
</div>
<br><br>
<<link "Return">><<goto $returnPassage>><</link>>
<div style="text-align:center;">
<h2><<print $petName>> — <<= $petType >></h2>
</div>
<<if $petType == "Aether Owl">>
Species: Aether Owl
Classification: Arcane-Linked Avian
Appearance: Feathers shimmer like pale mist; edges waver like moonlit fog
Temperament: Calm, perceptive, drawn to clarity and quiet minds
<<elseif $petType == "Ember Hound Pup">>
Species: Ember Hound Pup
Classification: Fire-Aligned Familiar
Appearance: Warm ember-like fur; paws glow faintly when excited
Temperament: Loyal, excitable, fiercely protective
<<elseif $petType == "Mossback Tortoise">>
Species: Mossback Tortoise
Classification: Earthbound Familiar
Appearance: Moss-covered shell; earthy scent; slow-lidded golden eyes
Temperament: Steady, peaceful, grounding
<<elseif $petType == "Starlit Cat">>
Species: Starlit Cat
Classification: Astral-Feral Familiar
Appearance: Fur dotted with drifting specks of starlight
Temperament: Curious, elusive, intelligent
<<else>>
You do not currently have a pet.
<</if>>
<br><br>
<<link "Return">><<goto Relationships>><</link>><<set $returnPassage = passage()>>
The world snaps inward—
light spiralling, sound thinning, your companion clinging close as everything collapses into a bright turning point—
—and then the ground returns beneath your feet.
Not stone walkways.
Not lantern-lit arches.
Your bedroom.
Still. Familiar. Quiet.
The air ripples softly as the magic settles. Your companion adjusts in your arms, blinking, then nestles closer as if this place already feels safe.
Hawthorne stands beside you, utterly composed.
As though moving worlds is nothing more than stepping across a threshold.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Hexmoor opens its gates on the first of September.<br>
I’ll collect you the day before term begins.
</div>
</div>
Your bags materialise neatly onto your bed, arranged with the kind of precision that suggests she never misplaces anything.
Then she fixes you with a steady, meaningful look —
the kind that carries weight for reasons you don’t yet understand.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
One more thing, and it is not optional:<br>
do not attempt magic outside of Hexmoor grounds<br>
before the school year begins.
</div>
</div>
Her tone isn’t sharp — just firm.
A boundary, clearly drawn.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
You are untrained.<br>
Unlicensed.<br>
And the safeguards protecting non-gifted society apply to you as well.<br>
Practice will come soon enough.
</div>
</div>
Your companion presses closer—
<<if $petType == "Aether Owl">>
emitting a soft, breathy *hoot*, like drifting wind agreeing with her.
<<elseif $petType == "Ember Hound Pup">>
letting out a warm, crackling *chirp*, its ember-bright tail flicking.
<<elseif $petType == "Mossback Tortoise">>
giving a slow, approving *thump* against your chest, steady as earth.
<<elseif $petType == "Starlit Cat">>
releasing a shimmering, celestial *hum* that vibrates faintly through your arm.
<</if>>
The faintest smile touches Hawthorne’s lips.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Rest. Prepare. And leave the magic alone until I return.<br>
Understood?
</div>
</div>
Before you can answer, she raises her hand again.
Light bends.
Air twists.
The spiral reforms in her palm — smaller, quicker, like a closing whisper.
And in a blink, she vanishes.
Leaving you alone in your room,
your companion curled against you,
your supplies neatly arranged…
…and the quiet truth settling in your chest:
You’re going to Hexmoor Academy.
Soon.
[[Wait for the day before term|Pre-Term Morning]]
<<set $returnPassage = passage()>>
With your robes, wand, textbooks, and final bits of equipment packed away,
you finally let yourself breathe.
The weight on your shoulders feels good — earned, even.
Everything you need for Hexmoor is now securely in your hands.
Well… almost everything.
Hawthorne’s gaze shifts down the lane before you even speak.
The faintest tilt of her head tells you she already knows what’s missing.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
One last stop.
Your companion should be ready.
The shopkeeper has been watching them for you.
</div>
</div>
You adjust your bags and head back toward the creature shop.
The bell above the door gives its soft little chime.
Inside, the shopkeeper looks up immediately — eyes bright, amused, and almost relieved.
<div class="dialogueBox">
<div class="speakerName">Shopkeeper</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Ah — perfect timing.
They’ve been waiting for you the whole time.
</div>
</div>
They gesture warmly toward your companion, who reacts the instant they see you:
<<if $petType == "Aether Owl">>
The **Aether Owl** unfurls in a drift of pale, mistlike feathers,
gliding straight to your arm with a soft pulse of silver light.
<</if>>
<<if $petType == "Ember Hound Pup">>
The **Ember Hound Pup** gives an excited yip,
tail flaring like a spark as it tumbles eagerly into your hands.
<</if>>
<<if $petType == "Mossback Tortoise">>
The **Mossback Tortoise** ambles forward with slow, ancient certainty,
moss blooming warmly across its back as it nudges your foot.
<</if>>
<<if $petType == "Starlit Cat">>
The **Starlit Cat** rises with elegant confidence,
its coat shimmering with faint constellations as it curls around your leg
before allowing you to lift it.
<</if>>
The moment you pick them up, everything settles into place.
Natural. Warm. Familiar — like they were only waiting for you to come back.
<div class="dialogueBox">
<div class="speakerName">Shopkeeper</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Take good care of them.
And good luck at Hexmoor.
</div>
</div>
You step back out into the Hexmarket.
Hawthorne stands waiting near the alley’s center,
her attention briefly flicking to your companion.
A small, quiet approval softens her features.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Keep them close.
Transit spells can be disorienting the first time.
</div>
</div>
She lifts a hand.
Light folds inward.
Air twists into a helix.
A spinning ring of clear, glasslike magic forms —
a perfect spiral suspended in midair.
Wind stirs at your feet.
Your companion presses closer to your chest.
<div class="dialogueBox">
<div class="speakerName">Professor Clarissa Hawthorne</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
When the rings close — hold your breath.
</div>
</div>
The spiral tightens.
Light bends.
The street tilts sideways—
And the world snaps into a single turning point.
[[Continue|Teleport]]
<<set $returnPassage = passage()>>
The days after Hawthorne leaves settle into an odd rhythm — not quiet, not busy, but suspended.
Like you’re living in the pause between two chapters of your life.
Your robes hang neatly on your wardrobe door.
Your wand case rests beside a stack of textbooks.
Your equipment is arranged exactly as she left it.
And <<print $petName>> rarely strays far from your side.
Every morning, the anticipation sharpens a little more.
Hexmoor Academy.
Real arcane study.
A future that finally feels like it belongs to you.
You’ve never looked forward to anything this much.
By the morning **before** term begins — the day Hawthorne promised she would return — you’re already awake before the sun has fully risen.
Your mind keeps replaying the Hexmarket: the shifting lanterns, the impossible shopfronts, the moment your world opened wider than you knew it could.
While checking your bags again (for the fourth time), <<print $petName>> stirs and makes their familiar sound:
<<if $petType == "Aether Owl">>
A cool, breathy *hoot*.
<</if>>
<<if $petType == "Ember Hound Pup">>
A warm, crackling *chirp*.
<</if>>
<<if $petType == "Mossback Tortoise">>
A steady, grounding *thump*.
<</if>>
<<if $petType == "Starlit Cat">>
A faint, celestial *hum*.
<</if>>
You smile, reaching to lift them gently—
A knock at your front door.
You freeze.
It’s too early for Hawthorne.
Too mundane to be magic.
Too deliberate to be an accident.
<<print $petName>> tilts their head, mirroring your confusion.
You cross the short hallway — each step louder than it should feel — and open the door.
And your breath catches.
Standing outside is—
[[A woman|ExAppearsWoman]]---[[A man|ExAppearsMan]]<<set $returnPassage = passage()>> <<run addRelationship("Riley Smith", 19, "human")>>
You open the door.
Riley stands there — someone you once knew better than anyone — shifting her weight like she’s not sure she deserves to be here.
<div class="dialogueBox">
<div class="speakerName">Riley</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Hey… I didn’t think you’d actually open. I’ve been standing out here for a bit.
</div>
</div>
She gives a soft, awkward laugh, rubbing her hand against her arm.
<div class="dialogueBox">
<div class="speakerName">Riley</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
I wasn’t planning to come by today. I just… kept thinking about how we left things.
And I realised I never really apologised.
</div>
</div>
Her eyes drift past you, landing on the bags packed near the wall.
<div class="dialogueBox">
<div class="speakerName">Riley</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
You’re leaving?
</div>
</div>
You explain — vaguely — that you’re starting something new and won’t be around for a while.
Riley nods slowly, absorbing it.
<div class="dialogueBox">
<div class="speakerName">Riley</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
I didn’t know. I just… wanted to fix what I could before I regret it even more.
Even if it’s just saying I’m sorry for messing things up.
</div>
</div>
She hesitates, then steps closer — not too close, just enough to make the air shift.
<div class="dialogueBox">
<div class="speakerName">Riley</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
I didn’t come here expecting anything.
I’m not trying to… rewind things or pretend we didn’t hurt each other.
I just kept thinking about how we ended, and how that last conversation—
that can’t be the final thing between us.
</div>
</div>
She shifts her weight, eyes flicking down for a moment before meeting yours again.
<div class="dialogueBox">
<div class="speakerName">Riley</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Talking to you now… it reminded me that we weren’t all mistakes.
There were good parts. Real ones.
And I guess I didn’t realise how much I missed feeling that until now.
</div>
</div>
She lets out a slow breath — steady, careful, like she’s deciding each word before it leaves her mouth.
<div class="dialogueBox">
<div class="speakerName">Riley</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
I’m not asking for anything big.
No promises. No “getting back together.”
Just… one moment that doesn’t feel heavy.
Something small and good before you go.
To leave things on a note that isn’t regret.
</div>
</div>
There’s no pressure in her voice.
Just honesty — quiet, vulnerable, and entirely human.
<div class="dialogueBox">
<div class="speakerName">Riley</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Only if you want it too.
</div>
</div>
[[Accept one last moment|ExFinal_Riley_Accept]]---[[Gently decline|ExFinal_Riley_Decline]]<<set $returnPassage = passage()>><<run addRelationship("Marcus Smith", 19, "human")>>
You open the door.
Marcus stands there — familiar, but changed in small ways.
His posture is tense, hands shoved awkwardly into his pockets, as though he’s not sure he deserves to be standing on your doorstep.
<div class="dialogueBox">
<div class="speakerName">Marcus</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Hey.
I… wasn’t sure you’d answer. I almost walked away twice.
</div>
</div>
He gives a quiet, embarrassed huff, eyes darting toward the ground before meeting yours again.
<div class="dialogueBox">
<div class="speakerName">Marcus</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
I didn’t plan this. I just kept thinking about how things ended between us,
and how I handled it. Or… how badly I handled it.
And I realised I never actually apologised.
</div>
</div>
His gaze drifts past your shoulder — to the packed bags by the wall, the folded clothes, the sense of goodbye already in the air.
<div class="dialogueBox">
<div class="speakerName">Marcus</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
You’re heading out.
</div>
</div>
You give him a simple explanation — you’re leaving for something important,
and you won’t be around for a while.
Not the details. He wouldn’t understand anyway.
Marcus nods slowly.
A small exhale escapes him, softer than before.
<div class="dialogueBox">
<div class="speakerName">Marcus</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
I get it. I’m not here to pry.
It just… it hit me that if I’m ever going to own up to my part in everything,
it should be now. Not when you’re already gone and out of reach.
</div>
</div>
He steps a little closer — not invading your space, just closing the emotional distance.
His voice steadies, but his eyes stay vulnerable.
<div class="dialogueBox">
<div class="speakerName">Marcus</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
I’m sorry. For the arguments.
For walking away instead of trying to fix things.
For making you feel like any of it was your fault.
</div>
</div>
A silence follows — not uncomfortable, just weighted with things unsaid.
Then he draws a small breath and speaks more gently.
<div class="dialogueBox">
<div class="speakerName">Marcus</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Look… I’m not asking for another chance.
I’m not pretending we’re magically fine now.
But if you wanted one last moment together — something good,
something not tied to how we ended…
I’d like that.
</div>
</div>
He holds your gaze — steady, hopeful, but not pushing.
<div class="dialogueBox">
<div class="speakerName">Marcus</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Only if you want it too.
</div>
</div>
<br>
[[Accept one last moment|ExFinal_Marcus_Accept]]
[[Gently decline|ExFinal_Marcus_Decline]]
<<set $returnPassage = passage()>>
Riley’s breath catches the moment you step aside, silently inviting her in.
She enters slowly, like she’s afraid one wrong move will break whatever fragile peace hangs between you. Your room feels smaller with her in it — not suffocating, but charged, as if the past has settled into the walls and is waiting to be acknowledged.
Riley glances at your bags again, then at you.
Her expression softens.
<div class="dialogueBox">
<div class="speakerName">Riley</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
I didn’t come here expecting anything.
But… I’m glad you didn’t shut the door on me.
</div>
</div>
She steps closer — slowly, giving you every chance to step back if you wanted to.
Her voice drops, warmer now.
<div class="dialogueBox">
<div class="speakerName">Riley</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
If this is our last moment… I want it to be something good.
Something we don’t regret.
</div>
</div>
She waits — completely still.
Letting you choose what happens next.
[[Kiss]]
<<set $returnPassage = passage()>>
Marcus steps inside slowly, as though crossing the threshold means something more than he’s willing to admit out loud.
The room feels different with him in it — heavier, but steady, like the air itself remembers the two of you together. He looks around once, then back to you, expression softening.
<div class="dialogueBox">
<div class="speakerName">Marcus</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
I didn’t expect you to say yes.
But… I’m glad you did.
</div>
</div>
He moves closer, close enough for the warmth of him to reach you, but he doesn’t touch you — not yet. He’s waiting, letting you set the pace.
<div class="dialogueBox">
<div class="speakerName">Marcus</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
I just want this to be real.
No guilt. No old arguments.
Just… us. One last time, in a good way.
</div>
</div>
He stops in front of you, steady and grounded, giving you all the space or closeness you might choose.
[[Kiss|Kiss Him]]
<<set $returnPassage = passage()>>
Riley steps in close enough that the door brushes shut behind her with a soft click.
Her gaze drifts over your face, lingering on your mouth.
When she speaks, her voice is low — almost unsteady.
<div class="dialogueBox"> <div class="speakerName">Riley</div> <div class="dialogueDivider"></div> <div class="dialogueText"> I’ve missed you more than I should admit. </div> </div>
She reaches for your shirt — lightly at first — then grips it, pulling you toward her.
The kiss starts warm, but it deepens fast.
Her hands slide up your back, fingers curling just enough to make your breath catch.
She kisses you like someone who’s been replaying this in her head for months, like she’s relieved it still feels right.
Your hips brush.
Heat flares.
Riley exhales against your mouth, her breath shaky as her lips trail to your jaw, then just beneath your ear.
Her fingers slip under the hem of your shirt — not pushing, not taking — just touching, slow and deliberate, feeling the warmth of your skin.
She murmurs against your neck, voice warm and trembling.
<div class="dialogueBox"> <div class="speakerName">Riley</div> <div class="dialogueDivider"></div> <div class="dialogueText"> Tell me if you want me to stop… because I really, really don’t want to. </div> </div>
Her body presses to yours, her legs brushing yours as she guides you back into the room,
not forceful, just wanting to be closer — close enough that you feel every breath she takes.
Her forehead rests against yours, lips hovering.
[[Stop|StopFemale]]---[[Go Further|GoFurtherFemale]]<<set $returnPassage = passage()>>
Marcus doesn’t waste time hiding how he feels.
He steps inside the moment you open the door wider, closing it behind him with one hand — the other already finding your waist.
His eyes search yours, heat rising behind them.
<div class="dialogueBox"> <div class="speakerName">Marcus</div> <div class="dialogueDivider"></div> <div class="dialogueText"> I shouldn’t want this as much as I do. </div> </div>
His fingers slide up your side as he leans in,
and the kiss he gives you is deep, confident, wanting —
the kind that steals air from your lungs.
He crowds you gently against the wall, but not trapping you — just letting you feel him,
his breath warm, his heartbeat strong and quick against your chest.
His mouth trails from your lips down to your neck, slow and deliberate,
each touch sending a pulse of heat through you.
His grip tightens at your hip, thumb tracing small circles that make your breath stutter.
He pulls back just enough to look at you —
close, intense, wanting.
<div class="dialogueBox"> <div class="speakerName">Marcus</div> <div class="dialogueDivider"></div> <div class="dialogueText"> Say the word and I’ll stop. But I don’t want to. Not tonight. </div> </div>
His fingers brush under the fabric at your waist, slow but unmistakably intimate.
He leans his forehead to yours, breathing hard —
waiting, holding himself back by inches.
[[Stop]]---[[Go Further]]<div style="text-align:center;">
<h2>Riley Smith</h2>
</div>
Age: 19
Pronouns: She/Her/Hers
House: Unsorted (Non-gifted)
Relation to you: Ex girlfriend
Height & Build: Around 5'6"; soft but toned, athletic in an effortless, everyday way
Face: Warm features; expressive hazel eyes that shift between soft and sharp depending on her mood
Hair: Shoulder-length dark auburn hair, usually tied in a loose ponytail or falling naturally around her face
Skin: Warm light-brown tone with faint freckles across her cheeks and nose
Expression: Open but guarded; a half-smile that still remembers what it’s like to be close to you
Clothing: Casual hoodie or jacket layered over fitted jeans; sleeves often pushed up; faint scent of citrus shampoo
Breast Size: Moderate, natural
Hips & Figure: Noticeable curve at the waist and hips
Arse: Rounded and soft, subtle but present
Genitals: Vagina
<<link "Return">><<goto Relationships>><</link>><div style="text-align:center;">
<h2>Marcus Smith</h2>
</div>
Age: 19
Pronouns: He/Him/His
House: Unsorted (Non-gifted)
Relation to you: Ex boyfriend
Height & Build: Around 6'1"; broad-shouldered, athletic without trying to be
Face: Strong jawline softened by warm brown eyes; brows that draw together when he’s nervous
Hair: Short, dark brown, slightly messy like he runs a hand through it when thinking
Skin: Medium tan complexion with a few faint scars from sports or roughhousing
Expression: Earnest, slightly conflicted; the kind of look that carries unspoken thoughts
Clothing: Casual t-shirt or hoodie layered under a denim or bomber jacket; worn trainers
Chest & Build: Broad chest, lightly muscled
Hips & Figure: Straight, athletic waist
Arse: Firm, rounded, visible when he stands or leans forward
Genitals: <<print $marcusGenitals>>
<<link "Return">><<goto Relationships>><</link>><<set $returnPassage = passage()>>
<div class="dialogueBox">
<div class="speakerName">Opsmaser</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Thank you for playing, this is the end of the current version. Stay tuned for the next update.
</div>
</div><<set $returnPassage = passage()>>
<div class="dialogueBox">
<div class="speakerName">Opsmaser</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Thank you for playing, this is the end of the current version. Stay tuned for the next update.
</div>
</div><<set $returnPassage = passage()>>
<div class="dialogueBox">
<div class="speakerName">Opsmaser</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Thank you for playing, this is the end of the current version. Stay tuned for the next update.
</div>
</div><<set $returnPassage = passage()>>
<div class="dialogueBox">
<div class="speakerName">Opsmaser</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Thank you for playing, this is the end of the current version. Stay tuned for the next update.
</div>
</div><<set $returnPassage = passage()>>
<div class="dialogueBox">
<div class="speakerName">Opsmaser</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Thank you for playing, this is the end of the current version. Stay tuned for the next update.
</div>
</div><<set $returnPassage = passage()>>
<div class="dialogueBox">
<div class="speakerName">Opsmaser</div>
<div class="dialogueDivider"></div>
<div class="dialogueText">
Thank you for playing, this is the end of the current version. Stay tuned for the next update.
</div>
</div>